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 并继续执行直到它也完成。