Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1

关于父进程先于子进程终止后,子进程应该由init进程收养,所以子进程的ppid不应该是1吗?但我用C语言查看时显示的确是另一个进程id:1795

#include<unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

int main(void)
{
pid_t pid;

if((pid = fork()) == 0)
{
    sleep(4);
    printf("child 1, pid = %d\tppid = %d\n",pid, getppid());
    exit(0);
}
if((pid = fork()) == 0)
{
    sleep(3);
    printf("child 2, pid = %d\tppid = %d\n",pid, getppid());
    exit(0);
}

printf("parent, pid = %d\tppid = %d\n", getpid(), getppid());
exit(0);
}

结果如下:
parent, pid = 5462 ppid = 5305
child 2, pid = 5464 ppid = 1759
child 1, pid = 5463 ppid = 1759

求解释

suoyudong
头前一点白 user下的init进程
一年多之前 回复

6个回答

如果是在图形界面的终端运行,ppid则为桌面进程,如果在字符界面运行子进程的ppid为1

你这个打印出来的结果绝对是有问题的 ,我用你的代码重新敲了一下,我打印出来的结果是;
parent,pid = 5813 ppid = 5352
child 2 pid = 0 ppid = 1
chiled 1 pid = 0 ppid = 1

这样看来你所打印的pid 和ppid 都有问题,代码我觉得没什么问题 ,但是,看不懂你的打印结果

u010136832
小邓在路上 我在readhet下面跑的 ,不过不管是什么 ,终究是linux ,所有的孤儿进程都会被init进程收养,init进程号为 1 这个是确定的 ,知道就好,不必深究。
大约 6 年之前 回复
qq1519932709
qq1519932709 我也不知道,试了好多次,没有父进程终止后子进程的新父进程是1的。我装双系统,用的是ubuntu,这个应该不会有影响吧。
大约 6 年之前 回复

pid应该是0,ppid应该是1.这才符合进程管理机制

我也遇到了这种情况,用ps命令看了一下发现打出来的父进程号是init,ps:我也是ubuntu

我在Ubuntu下也是这样,貌似跟Ubuntu采用的upstart有关,用一个名为init --user的进程代替了init,

只有kill掉那个进程才会被init接管。。。不知道有什么差别?

求解惑。。

这个问题对我来说很坑,一直是按 APUE 讲的内容来理解的。
经过一顿纠结之后,了解到 LINUX 系统中子进程只要有一个进程统一负责领养就可以。
在 Ubuntu 18 (桌面版) 中,我发现是 systemd 负责领养,所以父进程 exit 掉的子进程 ppid 不是 1
另外,systemd 的父进程是 1.
并且 kill systemd 的话,系统会重新要求登录(相当于‘注销’的效果)。

参考:
https://stackoverflow.com/questions/43390211/pythons-daemon-ppid-not-equal-to-1

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐