父进程exit(0)之后,其子进程和孙进程的getppid()都是1吗?

宇宙漫步者 2011-09-22 11:23:33
如题!
如果都是1,请问作何解释?
按照我个人的理解,父进程exit之后,子进程仍然存在,那么孙进程getppid()的值应该是子进程的ID,子进程getppid()的值为1
...全文
578 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason_Mraze 2014-04-17
  • 打赏
  • 举报
回复
父进程退出后,由于子进程还没有退出,此时会交由init进程来管理销毁这个子进程,init就成为父进程了
SnowCrumble 2011-09-26
  • 打赏
  • 举报
回复
父进程退了,子进程的父进程就是1
1就是Linux的最初始的进程,所有进程都是它启动起来的。相当于 祖师爷。父亲没了,就把儿子给祖师爷保管了
宇宙漫步者 2011-09-24
  • 打赏
  • 举报
回复
自己顶顶
宇宙漫步者 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gdujian0119 的回复:]
引用 6 楼 fangang001 的回复:

引用 5 楼 gdujian0119 的回复:
回复一楼:楼主说的是getppid()不是getpid()。
楼主意思是当前进程的父进程退出了,那当前进程的getppid()是谁呢。
这个应该是当前进程的父进程的父进程,或者直接就是init(好像是这个名字,以下简称为这个名字)进程。
init为系统最开始的进程,除非电脑关机否则它是一直存……
[/Quote]

下面的是我自己写的测试程序,测试结果是只有子进程的getppid()的值为1(init),这个怎么解释呢?我也糊涂了。。。:
#include"myapue.h"

static void pr_ids(char *name)
{
printf("%s:pid=%d,ppid=%d,pgrp=%d,tpgrp=%d\n",
name,getpid(),getppid(),getpgrp(),
tcgetpgrp(STDIN_FILENO));
fflush(stdout);
}
int main(void)
{
pid_t pid;
pr_ids("parent");
if((pid=fork())<0){
printf("fork error!\n");
}else if(pid>0){ /*parent*/
exit(0);
}else{ /*child*/
sleep(5);
pr_ids("child");
if((pid=fork())<0)
printf("second fork error!\n");
else if(pid==0) /*grandson*/
{
pr_ids("grandson");
}
}
exit(0);
}
输出结果:
parent:pid=4009,ppid=3920,pgrp=4009,tpgrp=4009
child:pid=4010,ppid=1,pgrp=4009,tpgrp=3920
grandson:pid=4013,ppid=4010,pgrp=4009,tpgrp=3920
freetstar 2011-09-23
  • 打赏
  • 举报
回复
lz看的是apue吗?多少页
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 justkk 的回复:]
父进程退出了,其子进程的父进程ID将变为1
但是对于子进程A的子进程B来说,其父进程ID当然还是A的进程ID
[/Quote]
我个人也是这么理解的,否则父子关系不是很“脆弱”,但是书中都没有提到这一点,等待合理解释。。。
justkk 2011-09-23
  • 打赏
  • 举报
回复
父进程退出了,其子进程的父进程ID将变为1
但是对于子进程A的子进程B来说,其父进程ID当然还是A的进程ID
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
早上服务器挂掉了,自己回复了三次,实在不好意思
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gdujian0119 的回复:]
回复一楼:楼主说的是getppid()不是getpid()。
楼主意思是当前进程的父进程退出了,那当前进程的getppid()是谁呢。
这个应该是当前进程的父进程的父进程,或者直接就是init(好像是这个名字,以下简称为这个名字)进程。
init为系统最开始的进程,除非电脑关机否则它是一直存在的。
[/Quote]
不知道为什么会是这种情况,有没有合理的解释呢,谢谢5#
孤独小剑 2011-09-23
  • 打赏
  • 举报
回复
回复一楼:楼主说的是getppid()不是getpid()。
楼主意思是当前进程的父进程退出了,那当前进程的getppid()是谁呢。
这个应该是当前进程的父进程的父进程,或者直接就是init(好像是这个名字,以下简称为这个名字)进程。
init为系统最开始的进程,除非电脑关机否则它是一直存在的。
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
我的意思是父进程exit之后子,孙进程getppid()的值,不过还是谢谢1#
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
我的意思是父进程exit之后,子,孙进程getppid()的值!不过还是谢谢1#
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
我的意思是父进程exit之后,子,孙进程getppid()的值,不过还是谢谢1#
孤独小剑 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fangang001 的回复:]

引用 5 楼 gdujian0119 的回复:
回复一楼:楼主说的是getppid()不是getpid()。
楼主意思是当前进程的父进程退出了,那当前进程的getppid()是谁呢。
这个应该是当前进程的父进程的父进程,或者直接就是init(好像是这个名字,以下简称为这个名字)进程。
init为系统最开始的进程,除非电脑关机否则它是一直存在的。

不知道为什么会是这种情况,有没有合理……
[/Quote]每个进程都要有个父进程,这个是必要的,不如这个进程任务执行完但要有得到改进程的返回值以及处理此进程依然所占的资源(该进程已可能成僵尸进程),虽然进程不在运行了,但内存还要保存该进程的一些信息,这部分信息就需要它的父进程去访问和释放。如果其父进程意外退出则其为孤儿进程则需要其它进程接管它。如果没其它进程则由init进程接管(这个进程是肯定存在的)。
大概过程就是上面说的,细节的话楼主需要专门找书系统看一下。网上的东西一般只能其它指导的功能。
bayougeng 2011-09-23
  • 打赏
  • 举报
回复
mark下,过两天来看答案
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
CSDN自动排版了,看起来不是很明了,请各位见谅!
宇宙漫步者 2011-09-23
  • 打赏
  • 举报
回复
这是我的具体代码:
#include"myapue.h"
#include<errno.h>

static void sig_hup(int signo)
{
printf("SIGHUP received ,pid=%d\n",getpid());
}
static void pr_ids(char *name)
{
printf("%s:pid=%d,ppid=%d,pgrp=%d,tpgrp=%d\n",
name,getpid(),getppid(),getpgrp(),
tcgetpgrp(STDIN_FILENO));
fflush(stdout);
}
int main(void)
{
char c;
pid_t pid;
pr_ids("parent");
if((pid=fork())<0){
printf("fork error!\n");
}else if(pid>0){ /*parent*/
sleep(5);
exit(0);
}else{ /*child*/
pr_ids("1--child");
if((pid=fork())<0)
printf("second fork error!\n");
else if(pid==0) /*grandson*/
{
pr_ids("grandson");
signal(SIGHUP,sig_hup);
kill(getpid(),SIGTSTP);
pr_ids("grandson");
if(read(STDIN_FILENO,&c,1)!=1)
printf("read error from controlling TTY,errno=%d\n",
errno);
exit(0);
}
sleep(5);//测试结果中,分别将此处注释掉
pr_ids("2--child");
}
exit(0);
}
运行结果:
%%%%%%%%%%%%%%%%%%%%
sleep(5);
%%%%%%%%%%%%%%%%%%%%
parent:pid=4290,ppid=3924,pgrp=4290,tpgrp=4290
1--child:pid=4291,ppid=4290,pgrp=4290,tpgrp=4290
grandson:pid=4292,ppid=4291,pgrp=4290,tpgrp=4290
SIGHUP received ,pid=4292
grandson:pid=4292,ppid=1,pgrp=4290,tpgrp=3924
read error from controlling TTY,errno=5

%%%%%%%%%%%%%%%%%%%%
//sleep(5);
%%%%%%%%%%%%%%%%%%%%
parent:pid=4322,ppid=3924,pgrp=4322,tpgrp=4322
1--child:pid=4323,ppid=4322,pgrp=4322,tpgrp=4322
grandson:pid=4324,ppid=4323,pgrp=4322,tpgrp=4322
2--child:pid=4323,ppid=4322,pgrp=4322,tpgrp=4322
SIGHUP received ,pid=4324
grandson:pid=4324,ppid=1,pgrp=4322,tpgrp=3924
read error from controlling TTY,errno=5
这里面有两个问题
(1)孙进程的getppid()=1
(2)sleep(5)之后的为什么没有输出
等待合理的解释...
帅得不敢出门 2011-09-23
  • 打赏
  • 举报
回复
孙进程的父亲不是还在, 它不算孤儿. 没有必要再让init来领养.
Jake443403168 2011-09-22
  • 打赏
  • 举报
回复
进程的ID是不可能相同的,创建一个进程,系统就会给它一个编号,不会重复,lz写个程序测试一下就知道了

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧