1

の後に子で次の行を使用するとfork:

while( getppid() != 1 )

親が子の前に終了するようにするには (親が終了すると、子プロセスの親がプロセスになるためinit)、どのような問題に直面する可能性がありますか?

これは、子が親の後に終了することを保証する良い方法ですか?

他にどのような方法がありますか?

4

1 に答える 1

0

スピンループは決して良いことではありません。フォークする前にパイプを開きます。子ブロックを読み取ります。親が終了すると、パイプが閉じ、子が続行します。(子供がパイプの書き込み側を閉じていることを確認してください!)

例: (警告: すべてのエラーチェックが省略されています)

int
main( void ) {
    int fd[ 2 ];
    pipe( fd );
    if( fork() ) {
        sleep( 2 );
        puts( "parent awakes" );
    } else {
        char k;
        close( fd[ 1 ]);
        read( fd[ 0 ], &k, 1 );
        puts( "child continues" );
    }
    return 0;
}

また、子はパイプの読み取り側を閉じる必要がありますが、親が終了するのを待つという問題とは関係がないため、サンプル コードから除外しました。

于 2013-02-04T13:32:50.823 に答える