在 Linux 中使用管道标准输入和标准输出执行子进程
在 Linux 中,需要使用管道标准输入(stdin)执行子进程的任务)和标准输出(stdout)可以通过各种系统调用或 POSIX 函数来完成。具体来说,对于 Linux 3.0 及更高版本,推荐的方法包括使用 pipeline()、fork()、execve() 和 dup2()。
解决方案概述
创建管道:
Fork 进程:
子进程中的 IO 重定向:
关闭未使用的管道:
子进程:
IO 通信:
实现
以下 C 代码演示了此解决方案:
#include <iostream> #include <cstdlib> #include <cstring> #include <unistd.h> #include <fcntl.h> using namespace std; int main() { int aStdinPipe[2], aStdoutPipe[2]; pid_t childPid; char buffer[1024]; const char* command = "foo"; string input = "Hello World!"; // Create pipes if (pipe(aStdinPipe) == -1 || pipe(aStdoutPipe) == -1) { cerr << "Error creating pipes." << endl; return EXIT_FAILURE; } // Fork child process childPid = fork(); if (childPid == -1) { cerr << "Error creating child process." << endl; return EXIT_FAILURE; } // Redirect IO in child process if (childPid == 0) { // Child process if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1 || dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1 || dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) { cerr << "Error redirecting IO in child." << endl; return EXIT_FAILURE; } // Close unused pipes close(aStdinPipe[PIPE_READ]); close(aStdinPipe[PIPE_WRITE]); close(aStdoutPipe[PIPE_WRITE]); // Execute command execve(command, NULL, NULL); } // Close unused pipes in parent process close(aStdinPipe[PIPE_READ]); close(aStdoutPipe[PIPE_WRITE]); // Write input to child process write(aStdinPipe[PIPE_WRITE], input.c_str(), input.length()); // Read output from child process int numBytesRead = 0; while ((numBytesRead = read(aStdoutPipe[PIPE_READ], buffer, sizeof(buffer))) > 0) { cout.write(buffer, numBytesRead); } // Close remaining pipes close(aStdinPipe[PIPE_WRITE]); close(aStdoutPipe[PIPE_READ]); return EXIT_SUCCESS; }
此代码将使用输入字符串 input 执行 foo 命令,并且 foo 的输出将打印到控制台.
以上是如何在 Linux 中使用管道 Stdin 和 Stdout 执行子进程?的详细内容。更多信息请关注PHP中文网其他相关文章!