Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么wait()将forked进程的状态设置为255而不是-1退出状态?_C_Posix_Exit_Waitpid - Fatal编程技术网

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

C 为什么wait()将forked进程的状态设置为255而不是-1退出状态?,c,posix,exit,waitpid,C,Posix,Exit,Waitpid,我试图从子进程返回一个整数值 但是,如果我使用exit(1)我会得到256作为wait()的输出。使用exit(-1)给出65280 有没有一种方法可以获得从子进程发送的实际int值 if(!(pid=fork())) { exit(1); } waitpid(pid,&status,0); printf("%d",status); 编辑:使用exit(-1)(这是我真正想要的)我得到255作为WEXITSTATUS(status)的输出。它应该是未签名的吗

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

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

有没有一种方法可以获得从子进程发送的实际int值

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
printf("%d",status);
编辑:使用
exit(-1)
(这是我真正想要的)我得到255作为
WEXITSTATUS(status)
的输出。它应该是未签名的吗?

你试过“男服务员”吗

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

您的代码的可移植版本为:

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

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

退出代码是一个16位的值

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

如果进程正常退出,低阶8位为零,或者对终止进程的信号号进行编码,以及是否转储内核(如果发出信号,高阶位为零)

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

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

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

e、 g:

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

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

我刚刚读到,对于完全终止,建议退出()而不是退出(),就在stackoverflow.com上。
exit()
vs
\u exit()
的使用无关紧要-退出状态的处理方式与此相同。使用
exit()。使用
\u exit()
是有理由的,但很少有理由。是的
退出
绝对是正确的。你的问题不是
exit
,而是
waitpid
,正如Damon的回答所示。另请参阅,你能给我一些关于使用你的代码退出(-1)的输出255的线索吗?在2的补码表示法中,值-1是所有位设置的。如果将其掩码为8位,并将其视为无符号,则看起来像255位。无法区分退出(-1)和退出(255)是从等待函数系列返回退出值的方式的一个不幸限制。没有回答这个问题,是否无法从退出状态获取超过255个值?在POSIX ish系统上,否。在Windows上,是。另请参阅