通过管道将标准 I/O 参数传递给子进程
目标是创建一个执行子进程的 C 函数 (" foo") 将提供的字符串作为标准输入 ("s") 并以字符串形式返回子级的标准输出
系统调用和 POSIX 函数
此任务需要以下系统调用和 POSIX 函数:
函数实现
下面的函数按照以下步骤使用管道标准 I/O 执行子进程:
子进程中:
在父进程中:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #define PIPE_READ 0 #define PIPE_WRITE 1 string f(string s) { int inputPipe[2]; int outputPipe[2]; pid_t childPid; char c; string result; if (pipe(inputPipe) < 0 || pipe(outputPipe) < 0) { perror("Error creating pipes"); return ""; } if ((childPid = fork()) == -1) { perror("Error creating child process"); return ""; } else if (childPid == 0) { // Child process // Redirect standard input if (dup2(inputPipe[PIPE_READ], STDIN_FILENO) < 0) { perror("Error redirecting standard input"); exit(errno); } // Redirect standard output and standard error if (dup2(outputPipe[PIPE_WRITE], STDOUT_FILENO) < 0) { perror("Error redirecting standard output"); exit(errno); } if (dup2(outputPipe[PIPE_WRITE], STDERR_FILENO) < 0) { perror("Error redirecting standard error"); exit(errno); } // Close unused pipes close(inputPipe[PIPE_READ]); close(inputPipe[PIPE_WRITE]); close(outputPipe[PIPE_READ]); // Execute child process execl("/bin/sh", "sh", "-c", s.c_str(), NULL); perror("Error executing child process"); exit(errno); } else { // Parent process // Close unused pipes close(inputPipe[PIPE_READ]); close(outputPipe[PIPE_WRITE]); // Write input string to child's standard input write(inputPipe[PIPE_WRITE], s.c_str(), s.size()); // Read output from child's standard output while (read(outputPipe[PIPE_READ], &c, 1) > 0) { result += c; } // Close pipes close(inputPipe[PIPE_WRITE]); close(outputPipe[PIPE_READ]); // Wait for child to finish waitpid(childPid, NULL, 0); } return result; }
以上是如何在 C 中使用管道标准 I/O 执行子进程?的详细内容。更多信息请关注PHP中文网其他相关文章!