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 でした。どうしてそうなるの?