【发布时间】:2012-12-26 17:47:46
【问题描述】:
我正在编写一个可以运行 Linux 命令的 C 程序,例如:cat /etc/passwd | grep list | cut -c 1-5
我没有任何结果
*这里父母等待第一个孩子(child_pid)完成;
第一个孩子等待第二个(pfils)!!
有什么想法吗?
代码:
main()
{
pid_t child_pid;
int fd[2];
int pfd[2];
pipe(pfd);
child_pid = fork ();
if (child_pid != 0)
{
wait(child_pid);
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
execlp("cut","cut","-c","1-5",NULL);
}
else
{
pid_t pfils = fork();
pipe(fd);
if(pfils == 0)
{
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execlp("cat", "cat","/etc/passwd",NULL);
}
else
{
wait(pfils);
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
close(pfd[0]);
dup2(pfd[1],1);
close(pfd[1]);
execlp("grep","grep","list",NULL);
}
}
}
【问题讨论】:
-
管道的一个方面是并发性,尤其是在具有多核的现代计算机上。通常,您不能等待管道中的第一个进程完成后再启动第二个进程,因为第一个进程可能会生成比管道中存储的数据更多的数据。您最终会看到第一个进程等待第二个进程读取,而第二个进程在启动其工作代码之前等待第一个进程死亡。在
execlp()调用之后,您还应该有错误报告代码,以防execlp()失败。 -
@falcon1990 子进程不需要wait(),,,我想分享一个链接A Good Code for Shell