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())。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...