2 qq1519932709 qq1519932709 于 2014.05.01 19:27 提问

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

求解释

6个回答

qq_32686815
qq_32686815   2017.04.27 15:58

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

u010136832
u010136832   2014.05.14 14:02

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

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

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

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

dudu2017
dudu2017   2015.01.18 16:25

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

dudu2017
dudu2017   2015.01.18 16:25

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

u010559446
u010559446   2015.05.12 16:25

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

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

求解惑。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!