1

我正在尝试制作一个在一个文件中运行 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。我查了 errno 14,它是一个 EFAULT,这表明 status 的地址是无效的。怎么会这样?

4

2 回答 2

0

问题可能是这一行:

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

在这里,您正在调用wait()它只需要一个参数。看起来您打算调用waitpid(),它需要三个参数(另外,在您询问的问题标题中waitpid())。如果您wait()使用三个参数调用,那么结果可能无法预测,并且肯定会导致您观察到的问题。

于 2013-12-22T20:39:18.973 回答
0

建议:

  1. 将 -Wall 添加到您的 gcc 参数中。

  2. 更多错误检查。在您的代码中,fork() 可能返回 -1,而 -1 是 waitpid 的有效输入,这可能是由于不同的行为。

于 2013-12-10T15:11:35.673 回答