0

プロセスを2つにフォークするコードを書いていると、親は引数をメインにパイプを介して子に送信します。子供は文字を1つずつ数え、最終結果を出力します。次に、親はwaitpid()を使用して子を刈り取ることになっています。

子プロセスでループを削除すると、リープが発生しますが、そのままにしておくと(これは必要です)、プログラムは実行されて終了しますが、リープは発生しません。なぜなのかわかりません。どんな助けでもありがたいです。これはクラスの宿題です。ありがとう!

これが私のコードです:

    if( waitpid( pid, &status, WNOHANG ) > 0 )
        {
        printf( "parent reaps child status 0x%08X\n", status );
        if( WIFEXITED(status) )
        printf( "child exited normally with %d\n", WEXITSTATUS(status) );
    }
    close( out );
    return 0;   

また、このコードにはエラーチェックがないことを認識しています...最初に機能させようとしていました...

4

1 に答える 1

4

いつ停止するかをクライアントに伝える必要があります。これは、パイプを閉じることによって行います。したがって、親プロセスは次のことを行う必要があります。

for( i = 0; i < (argc - 1); i++ )
{
    for( idx = 0; idx < strlen(argv[i + 1]); idx++ )
        write( out, &argv[i + 1][idx], 1 );
}
close(out);  // <----
sleep(1);
if( waitpid( pid, &status, WNOHANG ) > 0 )

また、WNOHANGは、子プロセスが終了していない場合は待機しないようにwaitpidに指示します。だからあなたの場合、それは終わっていません。

waitpid( pid, &status, WNOHANG )
                       ^^^^
于 2013-03-09T20:46:27.863 に答える