微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C、wait()返回什么进程?

如何解决C、wait()返回什么进程?

假设我在 main 中写了以下内容

int main() {
    int status;
    if ((p1 = fork()) != 0) {
        if ((p2 = fork()) != 0) {
            wait(&status);
            wait(&status);
        } else {
            processB();
        }
    }
    return 3;
}

加:

int processB() {
    return 1;
}

当进程 p2 结束时,它保存在 &status 中的值是多少?

例如,如果它使用 exit(100) 结束,那么它将返回 100,但我不知道在这种情况下会发生什么?

解决方法

进程的退出状态以 16 位编码。高 8 位包含来自 main() 的返回值或传递给 exit()(或其亲属之一)的值;低位 8 位包含终止进程的信号和指示创建核心转储的标志。如果进程正常退出,低位为零。 wait() 的返回值是死进程的 PID。

使用类似的代码以半清晰的格式打印出信息:

int corpse;
int status;
while ((corpse = wait(&status)) > 0)
    printf("PID %5d exited with status 0x%.4X\n",corpse,status);

如果你的程序在 return 3; 的末尾有 main(),那么通过状态指针报告给 wait() 的值将是 0x0300 (768 = 3 * 256) .如果您的程序调用 exit(100);,则 wait() 返回的值将为 0x6400 (100 = 6 * 16 + 4)。如果您的程序被中断 (SIGINT,2) 杀死,则 wait() 返回的值将为 0x0002。 (从技术上讲,实际值取决于系统,但这在历史上是准确的,我知道没有哪个系统不会发生这种情况。)

另见ExitCodes bigger than 255 — Possible?

POSIX 定义了 <sys/wait.h> 带有一堆相关宏的标题,例如:

  • WIFEXITED
  • WEXITSTATUS
  • WIFSIGNALED
  • WTERMSIG
  • WIFSTOPPED
  • WSTOPSIG

并且实现通常定义一个宏来检测核心转储——通常是 WCOREDUMP

另请参阅 wait() 的 POSIX 规范 (也指定了 waitpid())。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。