如果exec在第一个子进程中失败,我如何确保不分叉另一个进程并停止我的管道?我必须等待吗?
id_t pid, pid2;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0){
dup2(fd[WRITE_END], STDOUT_FILENO);
close(fd[WRITE_END]);
execlp("grep", "grep", "alpha",NULL);
}else{
pid2=fork();
if(pid2==0){
dup2(fd[READ_END], STDIN_FILENO);
close(fd[READ_END]);
execlp("grep", "grep", "alpha",NULL);
} else {
close(fd[READ_END]);
close(fd[WRITE_END]);
wait(NULL);
wait(NULL);
}
}
答案 0 :(得分:0)
你需要一个waitpid()语句,你还需要一个循环(警告:这不是实际运行的代码)
int pid_status, i;
for( i = 0; i < 2; i ++ ){
pid_t pid = fork();
if (pid == -1 ) retunr 1;
if( pid == 0 ){
--- do you stuff ---
}
if(waitpid(pid, &pid_status, 0 ) == -1{
return 1;
}
}
waitpid()将等到当前子进程完成。
答案 1 :(得分:0)
我如何确保不分叉另一个进程并停止我的进程 管道,如果exec在第一个子进程中失败?我必须等待吗?
我认为你必须更加关注array('1,'2','3','4')
失败时会发生什么,特别是你的代码没有什么特别之处,控件会在exec
之后跳转,我怀疑是安全。通常,只需在{:}之后调用if
exit
现在提出您的原始问题:不,exec(...); // if it works, ok...
exit(MY_FAILURE_CODE); // in case `exec` fails stops the program gracefully
肯定不适合您的需求,因为它会等到流程结束,您将无法在合适的时间启动其他人。但是你的需求可能不是真正的需求,你为什么要如此关注wait
失败呢?如果在一系列管道中出现所有问题都是相同的,那么中间会出现一些错误......通过调用exec
,您可以确保管道上没有编写器,这样读者就能够检测管道上的EOF然后在级联中停止等。一切都会好的。