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 这个是确定的 ,知道就好,不必深究。
大约 4 年之前 回复
qq1519932709
qq1519932709 我也不知道,试了好多次,没有父进程终止后子进程的新父进程是1的。我装双系统,用的是ubuntu,这个应该不会有影响吧。
大约 4 年之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ubuntu 14.04.1 LTS父进程终止,子进程没有被init(1)进程领养
fork一个子进程,在子进程中打印父进程终止前后的PPID:按照正常的理解,首先会打印父进程的PID,然后会打印init(PID=1)。因为子进程转为孤儿进程被init进程收养。#include #include #include #include #include #include int main (void) { pid_t pid; fflu
进程学习——父进程子进程ID
今天在测试共享内存时编写了一个进程测试的代码,在调用fork函数创建子进程时,在父进程中返回子进程pid,在子进程中返回0;具体代码如下: #include <unistd.h> #include <stdio.h>int main() { pid_t pid; pid = fork(); //父进程 if(pid != 0) { printf(
kill掉父进程,子进程不同的运行方式
第一种情况: [root@qht2 ~]# ps -ef | grep httpd root 3799 1 0 10:41 pts/0 00:00:00 /usr/sbin/nss_pcache off /etc/httpd/alias root 3803 1 3 10:41 ? 00:00:00 /usr/sbin/httpd apache 3807 3803 0 10:41 ? 0
父进程退出,保证子进程交由init。
最近写代码遇到fujinch
父子进程ID和进程收养问题(init与upstart)
本文链接:http://blog.csdn.net/lyh__521/article/details/50148025孙子进程的父进程是谁?为了方便描述,这里将子进程中创建的子进程称为孙子进程。测试代码:/* * getpid() 获取当前进程PID * getppid() 获取父进程的PID */ #include<stdio.h> #include<stdlib.h> main() {
linux中fork函数及子进程父进程进程先后
一、fork入门知识      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。     一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来
Linux 进程--父进程查询子进程的退出状态
转载至文章: linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid本节目标: 僵尸进程 SIGCHLD wait waitpid 僵尸进程当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止。子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进
Windows内核之进程的终止和子进程
1 进程终止的方法: 主线程的进入点函数返回(最好使用这个方法) 进程中的一个线程调用ExitProcesss函数(应该避免使用这种方法)。  另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。  进程中的所有线程自行终止运行(这种情况几乎从未发生)。    1.1  主线程进入点函数返回        始终都应该这样来设计应用程序,即只有当主线程的
进程管理:通过父进程ID获取子进程ID
为了提高效率,充分利用资源,需要采用多线程,多进程的设计。在网络通信程序中,无论是客户端,还是服务端,功能稍微扩展一下,基本上不可避免的要使用多线程,多进程。遇到一个需求,需要检测父进程A(Process A) ,创建的子进程B (Process B)。 其中 Process A是主程序Process Main创建的,在创建的时候可以获取Process A 的ID,因此把Process
init进程_处理子进程终止2
继续上一讲,分析handle_signal