为什么wait()返回-1错误代码?

时间:2014-03-14 13:04:03

标签: c macos fork wait status

我有以下代码:

void fork1()
{
    pid_t id, cpid;
    int status;

    id = fork();

    if (id > 0)
    {
        // parent code
        cpid = wait(&status);
        printf("I received from my child %d this information %d\n", cpid, status);
    }
    else if (id == 0)
    {
        // child code
        sleep(2);
        exit(46);
    }
    else
        exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}

输出结果为:

  

我收到了我的孩子-1这个信息0

那么,为什么我在-1之后收到wait错误代码?我希望收到值46作为状态。

修改

如果wait返回-1,我添加了以下代码:

printf("errno(%d): %s\n", errno, strerror(errno));

这是输出:

errno(4): Interrupted system call

1 个答案:

答案 0 :(得分:3)

man page for wait()告诉您返回值的含义。

  

如果由于向调用进程发送信号而返回wait()或waitpid(),则返回-1并将errno设置为[EINTR] ....否则,将返回(pid_t)-1 ,并设置errno以指示错误。

要了解errno的内容,您可以使用perror()strerror()

#include <errno.h>
#include <string.h>
// ...
perror("wait error: ");
// or
printf("errno(%d): %s\n", errno, strerror(errno));

wait()手册页中,错误可能是:

wait()函数在以下情况下失败:

  

ECHILD
  调用进程没有现成的未处理子进程。   
EINTR
  该功能被信号中断。 stat_loc指向的位置值未定义。

因此,一旦您打印errno值,您就应该知道出了什么问题。我没有在您的代码中看到任何具体显示导致它的原因。您可能想要做的一些好事,使用-Wall进行编译并确保您处理所有警告,并确保初始化所有变量。