如果我使用wait(null),并且我知道(肯定)子wait(null)进程会在我们到达父进程之前完成(退出),那么父进程是否会wait(null)阻塞?我的意思是,wait()不会得到任何信号吧?
int main() {
int pipe_descs[2] ;
int i, n, p ;
srand(time(NULL( ;
pipe(pipe_descs) ;
for (i = 0; i < 2; i++) {
pid_t status = fork() ;
if (status == 0) {
n = rand() % 100;
p = (int) getpid() ;
write(pipe_descs[1], &n, sizeof(int)) ;
write(pipe_descs[1], &p, sizeof(int)) ;
exit(0) ;
}
else {
read(pipe_descs[0], &n, sizeof(int)) ;
read(pipe_descs[0], &p, sizeof(int)) ;
printf(" %d %d\n", n, p) ;
wait(NULL) ; // (1)
}
}
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
Ton*_*ous 15
wait(NULL)将阻塞父进程,直到它的任何子进程完成。如果子进程在父进程到达之前终止,wait(NULL)则子进程将转向 azombie process直到其父进程等待它并从内存中释放它。
如果父进程不等待其子进程,并且父进程先完成,则子进程将成为孤儿并被分配init为其子进程。而init会等待并释放进程表中的进程表项。
换句话说:父进程将被阻塞,直到子进程向操作系统返回退出状态,然后再返回给父进程。如果子进程在父进程到达 wait(NULL) 之前完成,那么它将读取退出状态,释放进程表中的进程条目并继续执行,直到它也完成。