waitpid没有工作 - 错误错误

时间:2013-12-09 22:58:48

标签: c fork pid waitpid

我正在尝试创建一个在一个文件中运行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,表明状态地址无效。怎么会这样呢?

2 个答案:

答案 0 :(得分:1)

问题可能就在这一行:

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

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

答案 1 :(得分:0)

建议:

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

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