我正在尝试在C中实现管道-例如- $ ls | wc | wc
$ ls | wc | wc
我写了以下代码-
#include<stdio.h> #include<stdlib.h> #include <unistd.h> void run_cmd(char *cmd, int* fd_in, int* fd_out) { int c = fork(); if (c==0) { if (fd_in != NULL) { close(fd_in[1]); dup2(fd_in[0], 0); } if (fd_out != NULL) { close(fd_out[0]); dup2(fd_out[1],1); } execlp(cmd, cmd, NULL); } } int main(int argc, char **argv) { int fd_1[2], fd_2[2], i; pipe(fd_1); pipe(fd_2); run_cmd(argv[1], NULL, fd_1); for( i=2; i<argc-1; i++) { if (i%2 == 0) run_cmd(argv[i], fd_1, fd_2); else run_cmd(argv[i], fd_2, fd_1); } if (i%2 == 0) run_cmd(argv[i], fd_1, NULL); else run_cmd(argv[i], fd_2, NULL); }
使用两个参数可以很好地工作,例如- $./a.out ls wc
$./a.out ls wc
但是,当我尝试两个以上的参数时,它将不起作用。
有人可以告诉我我的代码有什么问题吗,或者有其他方法可以做到这一点?
这实际上没有进行错误检查,但是为什么这么复杂?
int main (int argc, char ** argv) { int i; for( i=1; i<argc-1; i++) { int pd[2]; pipe(pd); if (!fork()) { dup2(pd[1], 1); // remap output back to parent execlp(argv[i], argv[i], NULL); perror("exec"); abort(); } // remap output from previous child to input dup2(pd[0], 0); close(pd[1]); } execlp(argv[i], argv[i], NULL); perror("exec"); abort(); }