【问题标题】:Why does wait() set status to 255 instead of the -1 exit status of the forked process?为什么 wait() 将状态设置为 255 而不是分叉进程的 -1 退出状态?
【发布时间】:2011-04-09 05:54:09
【问题描述】:

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

但是,如果我使用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() 而不是 _exit() 来完全终止,就在 stackoverflow.com 上
  • exit()_exit() 的使用无关紧要 - 退出状态的处理方式相同。使用exit() 确保从标准I/O 通道和类似的清理问题中刷新待处理的输出 - 实际上,几乎一直使用exit()。有理由使用_exit(),但很少见。
  • 是的 exit 绝对是正确的。正如达蒙的回答所暗示的那样,您的问题不是exit,而是waitpid

标签: c posix exit waitpid


【解决方案1】:

你试过“man waitpid”吗?

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

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

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

【讨论】:

  • 您能否使用您的代码在输出 255 上为我提供退出(-1)的任何线索?
  • 在 2 的补码表示法中,值 -1 是所有位设置。如果将其屏蔽为 8 位并将其视为无符号,则它看起来像 255。无法区分 exit(-1) 和 exit(255) 是从等待函数系列返回退出值的方式的不幸限制。
【解决方案2】:

退出代码是一个 16 位值。

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

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

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

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    例如:

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

    【讨论】:

    • 不回答问题,
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 2015-09-04
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多