在Linux 中使用管道標準輸入和標準輸出執行子程序
在Linux 中,需要使用管道標準輸入(stdin)執行子程序的任務)和標準輸出(stdout)可以透過各種系統呼叫或POSIX 函數來完成。具體來說,對於 Linux 3.0 及更高版本,建議的方法包括使用 pipeline()、fork()、execve() 和 dup2()。
解決方案概述
建立管道:
實作
#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; }
以下C 程式碼示範了此解決方案:
此程式碼將使用此程式碼輸入字串執行foo 指令輸入,foo 的輸出將會印到控制台。以上是如何在 Linux 中使用管道 Stdin 和 Stdout 執行子程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!