15

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

但是,如果我使用exit(1)I get256作为wait(). 使用exit(-1)65280.

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

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

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

4

5 回答 5

25

你试过“man waitpid”吗?

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

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

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
于 2010-09-07T14:37:02.147 回答
13

退出代码是一个 16 位值。

高 8 位是exit().

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

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

于 2010-09-07T14:39:25.300 回答
4

请参阅文档。首先WIFEXITED用来判断是否正常终止(可能是非零状态)。然后,WEXITSTATUS用来判断实际状态的低8位是什么。

于 2010-09-07T14:39:18.800 回答
2

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

通过waitpid()or返回的状态wait()

例如:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
于 2015-04-10T19:58:05.063 回答
0

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

于 2016-01-31T00:37:58.103 回答