为什么wait()会将状态设置为255而不是forked进程的-1退出状态?

15

我试图从子进程返回一个整数值。

然而,如果我使用 exit(1) ,则从 wait() 获得的输出为 256。使用 exit(-1) 则得到 65280

有没有办法让我从子进程中获取实际发送的整数值?

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

编辑: 使用exit(-1)(这是我实际想要的),我得到了255作为WEXITSTATUS(status)的输出。它应该是无符号的吗?


我刚刚在stackoverflow.com上读到,建议使用exit()来完全终止程序,而不是使用_exit()。 - user191776
5
使用 exit()_exit() 都无所谓,两者都能处理退出状态。但使用 exit() 能确保从标准 I/O 渠道刷新挂起的输出和进行类似的清理工作 - 实际上,大多数情况下都应该使用 exit()。虽然使用 _exit() 也有其特殊情况,但这种情况很少见。 - Jonathan Leffler
是的,exit 绝对是正确的选择。你的问题并不在于 exit,而是像 Damon 的回答所建议的那样,在于 waitpid - Jens Gustedt
请参阅退出代码是否可以大于255? - Jonathan Leffler
5个回答

25

你尝试过"man waitpid"吗?

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

您的代码的可移植版本应该是:

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

你能否提供一些关于使用你的代码输出255给exit(-1)的线索? - user191776
在2的补码表示法中,值-1是所有位设置为1。如果您将其掩码为8位并将其视为无符号,则看起来像255。从wait函数系列返回退出值的方式的限制不幸地使得您无法区分exit(-1)和exit(255)。 - Darron

13

退出码是一个16位的值。

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

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

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


有没有办法从退出状态中获取超过255的值? - Debashish
2
在类POSIX系统上,不行。在Windows上,可以。 - Jonathan Leffler
请参阅ExitCodes bigger than 255 – Possible? - Jonathan Leffler

4
请查看文档。首先使用WIFEXITED来确定它是否正常终止(可能带有非零状态)。然后,使用WEXITSTATUS来确定实际状态的低8位是什么。

2

使用WEXITSTATUS()来读取子进程的正确退出状态。

waitpid()wait()返回的状态传递。

例如:

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

不回答问题。 - user207421

0

不是的,它将其设置为255。只有8个位可用。请参阅文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接