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

发布于 2024-09-18 06:01:00 字数 411 浏览 19 评论 0原文

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

但是,如果我使用 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)的输出。应该是未签名的吧?

I'm trying to return an integer value from a child process.

However, if I use exit(1) I get 256 as the output from wait(). Using exit(-1) gives 65280.

Is there a way I can get the actual int value that I send from the child process?

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

Edit: Using exit(-1) (which is what I actually want) I am getting 255 as the output for WEXITSTATUS(status). Is it supposed to be unsigned?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

甜宝宝 2024-09-25 06:01:00

你试过“man waitpid”吗?

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

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

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

Have you tried "man waitpid"?

The value returned from the waitpid() call is an encoding of the exit value. There are a set of macros that will provide the original exit value. Or you can try right shifting the value by 8 bits, if you don't care about portability.

The portable version of your code would be:

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
一念一轮回 2024-09-25 06:01:00

退出代码是一个 16 位值。

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

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

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

The exit code is a 16-bit value.

The high-order 8 bits are the exit code from exit().

The low-order 8 bits are zero if the process exited normally, or encode the signal number that killed the process, and whether it dumped core or not (and if it was signalled, the high-order bits are zero).

Check out the <sys/wait.h> header and the documentation for the waitpid() system call to see how to get the correct values with WIFEXITED and WEXITSTATUS.

温折酒 2024-09-25 06:01:00

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

See the documentation. First use WIFEXITED to determine whether it terminated normally (possibly with non-zero status). Then, use WEXITSTATUS to determine what the low-order 8 bits of the actual status are.

滥情空心 2024-09-25 06:01:00

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

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

例如:

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

Use WEXITSTATUS() to read the correct exit status of child

Pass the status returned by waitpid() or wait()

e.g.:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
您的好友蓝忘机已上羡 2024-09-25 06:01:00

事实并非如此。它将其设置为 255。只有 8 位可用。请参阅文档。

It doesn't. It sets it to 255. There are only 8 bits available. See the documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文