wait(NULL) 究竟是如何工作的?

Ala*_*uny 5 c fork wait

如果我使用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) 之前完成,那么它将读取退出状态,释放进程表中的进程条目并继续执行,直到它也完成。

  • 怎么“什么都没发生”?当然有些事情发生了:孩子被收割了,pid,退出代码被返回给调用者。 (2认同)