wait(NULL) 究竟是如何工作的?
How does wait(NULL) exactly work?
如果我使用 wait(null)
,并且我知道(肯定) child 将在我们到达 parent 过程中的 wait(null)
之前完成(退出) , wait(null)
会阻塞 parent 进程吗?
我的意思是,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 ;
}
wait(NULL)
将阻塞父进程,直到它的任何子进程完成。如果子进程在父进程到达 wait(NULL)
之前终止,则子进程将变为 zombie process
直到其父进程等待它并将其从内存中释放。
如果父进程不等待其子进程,并且父进程先完成,则子进程变为孤立进程并作为其子进程分配给 init
。而init会等待并释放进程table.
中的进程入口
换句话说:父进程将被阻塞,直到子进程 returns 返回到操作系统的退出状态,然后返回给父进程。如果子进程在父进程到达 wait(NULL) 之前完成,那么它将读取退出状态,释放进程中的进程条目 table 并继续执行直到它也完成。
如果我使用 wait(null)
,并且我知道(肯定) child 将在我们到达 parent 过程中的 wait(null)
之前完成(退出) , wait(null)
会阻塞 parent 进程吗?
我的意思是,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 ;
}
wait(NULL)
将阻塞父进程,直到它的任何子进程完成。如果子进程在父进程到达 wait(NULL)
之前终止,则子进程将变为 zombie process
直到其父进程等待它并将其从内存中释放。
如果父进程不等待其子进程,并且父进程先完成,则子进程变为孤立进程并作为其子进程分配给 init
。而init会等待并释放进程table.
换句话说:父进程将被阻塞,直到子进程 returns 返回到操作系统的退出状态,然后返回给父进程。如果子进程在父进程到达 wait(NULL) 之前完成,那么它将读取退出状态,释放进程中的进程条目 table 并继续执行直到它也完成。