我正在尝试创建一个在一个文件中运行exec的fork,然后等待它完成。如果子进程中的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。我查了一下错误14,这是一个EFAULT,表明状态地址无效。怎么会这样呢?
答案 0 :(得分:1)
问题可能就在这一行:
if(wait(pid, &status, 0) == pid) {
在这里,您正在调用只需一个参数的wait()
。看起来您打算拨打waitpid()
,这需要三个参数(在问题标题中,您也会询问waitpid()
)。如果您使用三个参数调用wait()
,则结果可能无法预测,并且肯定会导致您观察到的问题。
答案 1 :(得分:0)
建议:
将-Wall添加到您的gcc参数中。
更多错误检查。 在你的代码中,fork()可能返回-1,而-1是waitpid的有效输入,这可能是由于不同的行为造成的。