我有以下代码:
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
答案 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
进行编译并确保您处理所有警告,并确保初始化所有变量。