为什么wait()将状态设置为256而不是分叉进程的-1退出状态?

时间:2010-09-07 14:33:30

标签: c posix exit waitpid

我正在尝试从子进程返回一个整数值。

但是,如果我使用退出(1),我会输出 256 退出(-1)提供 65280

有没有办法可以获得我从子进程发送的实际int值?

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
printf("%d",status);

编辑:使用exit(-1)(这是我真正想要的)我得到255作为WEXITSTATUS(状态)的输出。它应该是未签名的吗?

5 个答案:

答案 0 :(得分:17)

你试过“man waitpid”吗?

waitpid()调用返回的值是退出值的编码。有一组宏将提供原始退出值。或者,如果您不关心可移植性,可以尝试将值右移8位。

您的代码的可移植版本将是:

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}

答案 1 :(得分:11)

退出代码是16位值。

高位8位是exit()的退出代码。

如果进程正常退出,则低8位为零,或编码杀死进程的信号编号,以及是否转储核心(如果发出信号,则高位为零)。

查看<sys/wait.h>标题和waitpid()系统调用的文档,了解如何使用WIFEXITED和WEXITSTATUS获取正确的值。

答案 2 :(得分:4)

请参阅documentation。首先使用WIFEXITED来确定它是否正常终止(可能具有非零状态)。然后,使用WEXITSTATUS确定实际状态的低8位是什么。

答案 3 :(得分:2)

使用WEXITSTATUS()读取孩子的正确退出状态

传递waitpid()wait()

返回的状态

例如:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));

答案 4 :(得分:0)

没有。它将其设置为255.只有8位可用。请参阅文档。