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

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

但是,如果我使用exit(1),我得到256作为输出。 exit(-1)给出65280

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

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

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

你试过“man waitpid”吗?

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

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

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

退出代码是16位值。

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

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

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

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

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

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

例如:

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

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