1

これは動作している私のプログラムの断片ですが、それを修正するマシンはこれを試みます:

strace ./watcher echo 2>&1 > /dev/null | grep wait | cut -c1-4

予想される出力は次のとおりです。

wait

しかし、私のプログラムはランダムな数の待機を出力します(このように):

wait
wait
wait
wait
wait
wait

これはコードです:

    // creates a child process
    pid_t process_id;
    int status;
    process_id = fork();
    switch(process_id)
    {
        case -1: // Error while making the forkFork failed
            fprintf(stderr, "Fork failed.\n");
            break;

        case 0: // Child process.
            execvp(command[0], command); // command here is char**

            // execvp only returns when error.
            Error(argv[0], 1); // Error just prints the error
            exit(1);
            break;

        default: // Parent process.
            while(!waitpid(process_id, &status, WNOHANG));
            finished(status); // It prints how the process has finished.
    }

問題は、内部にwaitpidがあるため、多くの待機が発生していることにあると思います。しかし、それを削除して waitpid をそのままにしておくと、次の出力が表示されます。

standard input: Input/output error

そのエラーを発生させずに待機呼び出しを 1 つだけ行う方法はありますか?

4

1 に答える 1

2

への呼び出しを設定しないようにすることができます。WNOHANGwaitpid()

これによりwaitpid()、子が終了するまでブロックされます。

于 2012-05-24T09:54:26.873 に答える