1. ホーム
  2. c

[解決済み] wait(NULL)は具体的にどのように動作するのですか?

2022-01-31 22:35:13

質問

を使用する場合 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 ;
}

解決方法は?

wait(NULL) は、子プロセスのいずれかが終了するまで親プロセスをブロックします。もし親プロセスが wait(NULL) の場合、子プロセスは zombie process 親が待機し、メモリから解放されるまで。

親プロセスが子プロセスを待たず、親プロセスが先に終了した場合、子プロセスは孤児となり、そのプロセスは init をその子とします。そして、initはプロセステーブルのプロセスエントリを待ち、解放します。

言い換えれば、子プロセスがオペレーティングシステムに終了ステータスを返し、それが親プロセスに返されるまで、親プロセスはブロックされることになります。親プロセスが wait(NULL) に達する前に子プロセスが終了した場合、子プロセスは終了ステータスを読み、プロセステーブルのプロセスエントリを解放し、同様に終了するまで実行を継続します。