我正在尝试在C中实现pipe道,例如 – $ 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],NULL); else run_cmd(argv[i],NULL); }
这工作正常,有两个参数,例如 – $./a.out ls wc
但是,当我尝试超过两个参数不起作用。
如何让g ++在terminal显示执行时间?
做备份时使用上次修改时间戳记的目录是否可靠?
如何检测文件是否被其他进程在Windows中打开
在Linux中操作u64types
任何人都可以告诉我的代码有什么问题,或者其他任何方式来做到这一点。 任何帮助将不胜感激。
closuresWindows服务的显示
无法在Linux中运行使用sfml的程序
为什么在等待条件variables时需要一个while循环?
这几乎没有错误检查,但为什么这么复杂?
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],NULL); perror("exec"); abort(); }
如果你仍然对为什么你的源不工作感兴趣(谢尔盖的解决方案是更好的反正):
问题是在父进程中不关闭fd_1的写入端。 因此, argv[1]和父母都是作曲家的作品,造成了混乱。 请不要询问更多的细节(特别是为什么如果你只使用一个管道,概率不会发生),但是如果你只是添加一个close( fd_1[1] );你的原始源代码就可以在树进程中运行close( fd_1[1] ); 第一次调用run_cmd()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。