0

2 つの子をフォークする ac プログラム、最初の子は 10 秒間スリープし、2 番目の子は最初の子の終了を待ち、関連するメッセージを出力します。親は 2 人の子の終了を待ちます。なぜ 2 番目の子なのかわかりません最初の子の終了を待ちません.plz help

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

main(){
    int status;
        pid_t child1, child2,ret,ret2;

    child1=fork();
    if(child1==0){
        //this branch of code is being executed by the child1 process

        printf("I'm the first child with %d, I sleep for 10 sec \n",getpid());
        sleep(10);
        printf("child1 pid %d exiting\n",getpid());
                exit(1);
    }
    if(child1>0){

        child2=fork();
        ret=waitpid(child1,&status,0);


        if(child2==0){

             wait(&status);//???why child2 does not wait the child1 exit?

            printf("I'm the second child with %d, I have waited for the termination of the first child\n",getpid());
                        printf("child2 exited\n");
                        exit(1);

        }
        if(child2>0){


                        printf("father of child2 is waiting\n");
            ret2=waitpid(child2,&status,0);
            printf("I'm the father, my terminated process id is: %d \n",getpid());
            printf("I'm the father, my first child's id is: %d\n", child1);
            printf("I'm tha father, my second child's id is: %d\n", child2);

        }


    }

return 0;
}
4

3 に答える 3

4

関数ファミリーは、wait親が子を待つためにのみ使用できます。プロセスが兄弟を待つために使用することはできません。

于 2013-01-19T21:05:22.517 に答える
3

プロセスはwait、その直接の子に対してのみ実行できます。この場合、親プロセスがwaitchild1 と child2 の両方に対して を実行する必要があることを意味します。

于 2013-01-19T21:04:38.400 に答える
0

プロセス階層の子は、親も別の子も待機しません。何らかの形式の IPC メカニズムを使用して、ある子から別の子に情報を伝達できます。

于 2013-01-24T12:01:10.933 に答える