该计划在
之下#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(int argc,char **argv)
{
int fds[2];
int error=pipe(fds);
if(error==-1)
{
perror("pipe");
return 1;
}
int ret=fork();
if(ret<0)
{perror("fork failed");
return 1;
}
else if(ret==0)
{
close(fds[0]);
close(1);
dup(fds[1]); char *argv[3];
argv[0]="ls";
argv[1]="-l";
argv[2]=NULL;
execvp(argv[0],argv);
}
else
{
int rett=fork();
if(rett<0)
{
perror("fork failed");
return 1;
}
else if(rett==0)
{
close(fds[1]);///
close(0);
dup(fds[0]);
char *argv[2];
argv[0]="wc";
argv[1]=NULL;
execvp(argv[0],argv);
}
else
{
waitpid(ret,NULL,7); /// wait for child process
waitpid(rett,NULL,7); //// wait for another child process
printf("Process %d finished\n",ret);
printf("Process %d finished\n",rett);
}
}
return 0;
}
下面有结果;为什么printf
在“wc”之前执行?
Process 7189 finished
Process 7190 finished
zyy@ubuntu:~$ 24 209 1125
答案 0 :(得分:1)
检查可返回错误的返回值函数。并且不要使用魔法数字而不是正确的标记。
您的waitpid
来电实际上并未等待任何流程完成,只会返回错误。你的幻数是多少&#34; 7&#34;意思?这不是文档告诉你的事情。数字7中的一个位是WNOHANG,它告诉waitpid
实际上并没有等待孩子们完成。这些标志中的另一个有效,但由于您没有对您的进程执行任何ptrace
,因此无用。第三位无效,我们会立即发出waitpid
错误。我不会告诉你哪个是因为你根本不应该这样做。阅读手册页。
您遇到的另一个问题是您还需要关闭父进程中的管道。 wc
将尝试从管道(在其stdin上)读取数据,直到管道关闭并且它仍然在父管道中保持打开状态。在父项退出后始终打印wc
的原因是它是关闭管道的父出口并使wc完成读取。