1

1 つのファイルで exec を実行し、それが完了するまで待機するフォークを作成しようとしています。子プロセスの exec がシグナルによって終了した場合、シグナルを出力したい。プログラムの実行に時間がかかりすぎる場合は、タイムアウトを出力したい。

        pid_t pid;
        pid = fork();

        if(pid == 0) {
            //child process
        }
        else {
            alarm(timeout);
            int status;
            if(wait(pid, &status, 0) == pid) {
                alarm(0);
                fpw = fopen(testreport, "a+");
                if(WIFSIGNALED(status)) {
                    fprintf(fpw, "Run time errors: signal %d\n", WTERMSIG(status);
                }
                else {
                    fprintf(fpw, "Run time errors: none");
                }
                fclose(fpw);
            }
            else {
                alarm(0);
                kill(pid, SIGTERM);
                fpw = fopen(testreport, "a+");
                fprintf(fpw, "Run time errors: timeout\n");
                fclose(fpw);
            }
        }

Testreport は、ファイル名に対して以前に宣言された char * です。ただし、waitpidは機能していません。結果のwaitpidとerrnoの値を出力すると、それぞれ-1と14が得られます。errno 14 を調べたところ、ステータスのアドレスが無効であることを示す EFAULT でした。どうしてそうなるの?

4

2 に答える 2

0

提案:

  1. -Wall を gcc パラメータに追加します。

  2. さらにエラーチェック。コードでは fork() が -1 を返す場合があり、-1 は waitpid の有効な入力です。これは異なる動作が原因である可能性があります。

于 2013-12-10T15:11:35.673 に答える
0

問題はおそらく次の行です。

        if(wait(pid, &status, 0) == pid) {

wait()ここでは、パラメーターを 1 つだけ取る呼び出しを行っています。を呼び出すつもりだったようです。これには 3 つのパラメーターが必要ですwaitpid()(また、質問のタイトルで、waitpid()3 つのパラメーターを使用して呼び出した場合wait()、結果は予測不能であり、観察した問題に確実につながる可能性があります。

于 2013-12-22T20:39:18.973 に答える