【问题标题】:C, What process returns for wait()?C、wait()返回什么进程?
【发布时间】:2021-07-09 16:00:45
【问题描述】:

假设我在 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,但我不知道在这种情况下会发生什么?

【问题讨论】:

  • } }} main 中缺少return 意味着main 返回0
  • 已修复,感谢您指出这一点
  • 为什么不在每次wait() 调用后打印status
  • @Barmar 知道但不知道它来自哪里
  • 您的代码存在竞争条件。无法保证哪个子进程将首先退出,因此您的两个等待调用可以将 p1 或 p2 的退出状态放入status。每个等待调用的返回值将是进程 ID,因此您可以将其与 p1 或 p2 进行匹配,以查看您得到了哪个,如果这对您很重要。

标签: c linux unix process kill


【解决方案1】:

进程的退出状态以 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);

如果您的程序在main() 的末尾有return 3;,那么通过指向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())。

【讨论】:

  • 所以在我的情况下是 3?
  • 但这里返回 768...onlinegdb.com/H19ZiKVId(完整代码)
  • 知道了,如果有人告诉我一个进程如果收到信号 x 它以 x+128 结束,这会影响答案吗?
  • 这是外壳的人工制品。当 shell 获得“孩子死于信号”状态时,它会将 wait() 返回的值(可能是 0x0006(对于 SIGABRT))转换为 128 + 6 = 134,并将其记录在 $? 中。 wait() 函数不这样做。 (有关更多信息,请参阅Exit Status and Errors 上的 POSIX shell 规范。)
  • 768(十进制)是 x0300(十六进制)。如上所述,高 8 位,即 0x03,具有返回值。低 8 位是 0x00,因为进程是自愿结束的,即它没有被杀死。 (由于严重错字删除了原始评论:我写的是 ... 16 bits ... 而不是 ... 8 bits ...
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 2023-03-27
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多