当前位置: 技术问答>linux和unix
管道中的父进程要不要等待子进程的退出?
来源: 互联网 发布时间:2015-11-18
本文导语: 我写的函数如下: void* io_open() { int p_out[2]; int pid; pipe(p_out); pid = fork(); if (pid==0){//child, write close(p_out[0]); dup2(p_out[1], 1); close(p_out[1]);...
我写的函数如下:
void* io_open()
{
int p_out[2];
int pid;
pipe(p_out);
pid = fork();
if (pid==0){//child, write
close(p_out[0]);
dup2(p_out[1], 1);
close(p_out[1]);
execl(io_path, io, NULL); //执行io_path下的io程序
} else if (schk_pid > 0){//father, read
close(p_out[1]);
if ((fp_io=fdopen(p_out[0], "r")) == NULL)
syserr("fdopen p_out[0]");
waitpid(&pid, NULL);//这句到底要不要?
close(p_out[1]);
}
return 0;
}
请问,有的书上没有写waitpid这句,到底要不要呢?注意,io程序可以接收退出信号。
void* io_open()
{
int p_out[2];
int pid;
pipe(p_out);
pid = fork();
if (pid==0){//child, write
close(p_out[0]);
dup2(p_out[1], 1);
close(p_out[1]);
execl(io_path, io, NULL); //执行io_path下的io程序
} else if (schk_pid > 0){//father, read
close(p_out[1]);
if ((fp_io=fdopen(p_out[0], "r")) == NULL)
syserr("fdopen p_out[0]");
waitpid(&pid, NULL);//这句到底要不要?
close(p_out[1]);
}
return 0;
}
请问,有的书上没有写waitpid这句,到底要不要呢?注意,io程序可以接收退出信号。
|
首先也许是笔误,waitpid下面一句应该是
close(p_out[0]);
waitpid的目的是为了让kernel能够清除子进程资源,在这里可以不要。
close(p_out[0]);
waitpid的目的是为了让kernel能够清除子进程资源,在这里可以不要。
|
有好。如果没有,close(p_out[0])可能会在child退出前执行,导致child报SIGPIPE。
|
父子进程间用同步手段来控制子进程后于父进程结束,这样就不用waitpid了