c - Unix fork parent id 不一致

标签 c unix fork

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char * argv[]) {
    printf("I am parent! My id: %d\n", (int)getpid());

    pid_t childPIDorZero = fork();

    if (childPIDorZero == -1) {
        perror("fork() error");
        exit(-1);
    }

    if (childPIDorZero == 0) {
        printf("Success. ID: %d, Parent ID: %d\n", (int)getpid(), (int)getppid());
    }

    return 0;
}

1-结果:

enter image description here

2-结果:

enter image description here

我不明白这种情况。结果 1 为真,结果 2 为假,但我没有做任何更改。为什么父 ID 结果不同?

最佳答案

因为 parent 从不等待 child 完成(参见 man waitpid)。

因此,父级甚至可以在子级开始执行之前终止,在这种情况下,子级将是 reparented .

该实验可能有趣的特征是新父代的 pid 是 919,而不是预期的 1。 (如维基百科文章中所述,没有父进程的子进程被分配给 init 进程,即 pid 1。)但是,Linux 有一个机制允许进程成为后代的“收割者”进程,而 Ubuntu 启用此功能可以为每个用户提供他们自己的 init 进程。如果您正在使用 upstart 运行系统,请参阅 man 5 init 中的“用户 session 模式”部分。

关于c - Unix fork parent id 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676490/

相关文章:

linux - 如何连续显示文件的最后几行内容

c - fork exec wait 退出并显示错误代码

c - fork 一个管道子进程

c - 如何在 UNIX 上将 PID 写入文件

c++ - CS高级项目思路涉及Unix系统编程

c - 如何在电影院中标记已占座位。 C编程

c - 正确传递包含指向函数的指针的数组

具有相同编译时间选项的两个进程可以在同一台机器上有不同的字节对齐方式吗?

c++ - Unix 套接字文件名错误

c - Linux下父进程和子进程的地址空间有什么区别?