Io-Redirection
如何在 C 程序中將 STDOUT 重定向到 STDIN
假設我想編寫一個執行相同命令的 C 程序:
ls -l | wc -l
以下是一種嘗試:
int main(){ int fd; char *buffer[] = {"ls", "-l", (char *) NULL}; char *buffer1[] = {"wc", "-l",(char *) NULL}; if(fork() == 0){ // I make the STDOUT_FILENO and fd equivalent if((fd = dup(STDOUT_FILENO)) == -1){ perror("error"); exit(EXIT_FAILURE); } close(fd); if(fork() == 0) execvp(buffer[0], buffer); // then I make fd and STDIN_FILENO equivalent in order to put the output of the previous command // as the input of the second command if(dup2(fd, STDIN_FILENO) == -1){ perror("error"); exit(EXIT_FAILURE); } execvp(buffer1[0], buffer1); } exit(EXIT_SUCCESS); }
但它只是執行
ls -l
而不將其輸出提供給wc -l
您必須在兩個程序之間創建一個管道。(這也是
|
在命令行上使用時會發生的情況。)有很多例子可以做到這一點,例如這裡。
基本上,您通過呼叫來創建管道
pipe()
,然後每個程序關閉管道的一端。