社区
Linux/Unix社区
帖子详情
父进程exit(0)之后,其子进程和孙进程的getppid()都是1吗?
宇宙漫步者
2011-09-22 11:23:33
如题!
如果都是1,请问作何解释?
按照我个人的理解,父进程exit之后,子进程仍然存在,那么孙进程getppid()的值应该是子进程的ID,子进程getppid()的值为1
...全文
578
19
打赏
收藏
父进程exit(0)之后,其子进程和孙进程的getppid()都是1吗?
如题! 如果都是1,请问作何解释? 按照我个人的理解,父进程exit之后,子进程仍然存在,那么孙进程getppid()的值应该是子进程的ID,子进程getppid()的值为1
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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写个程序测试一下就知道了
简单分析Python中用fork()函数生成的
子
进程
python的os module中有fork()函数用于生成
子
进程
,生成的
子
进程
是
父
进程
的镜像,但是它们有各自的地址空间,
子
进程
复制一份
父
进程
内存给自己,两个
进程
之 间的执行是相互独立的,其执行顺序可以是不确定的、随机的、不可预测的,这点与多线程的执行顺序相似。 import os def child(): print 'A new child:', os.get
pid
() print 'Parent id is:', os.getp
pid
() os._
exit
(0) def parent(): while True: new
pid
=os.fork()
python多线程DAY01.txt
前情回顾 1.epoll模型 : 效率高 , 触发方式更多 2.本地套接字 AF_UNIX 本地两个
进程
间的消息通信 3.多任务编程 * 并行 和 并发 *
进程
线程 4. 多
进程
编程 时间片 PCB
PID
父
子
进程
优先级
进程
特征
进程
状态: 就绪态 运行态 等待态 5. ps -aux ps -ajx pstree top nice 6. os.fork() 7. os.get
pid
() os.getp
pid
() os._
exit
() sys.
exit
() 8. 孤儿
进程
和僵尸
进程
**************************************************** 如何避免僵尸
进程
产生 * 处理
子
进程
退出状态
pid
,status = os.wait() 功能 :在
父
进程
中阻塞等待处理
子
进程
退出 返回值:
pid
退出的
子
进程
的
PID
号 status 获取
子
进程
退出状态
pid
,sta
fork
子
进程
父
进程
死掉
之后
,getp
pid
()不为1的解决办法
代码例子:程序在执行
之后
,会一直死在while中,打印发现当
父
进程
被终止,getp
pid
() 的值也不为1
pid
_t
pid
;if((
pid
= fork()) < 0){ printf("fork error\n");}else if(
pid
== 0){ while(getp
pid
() != 1) { sleep(1); } printf("ente...
父
进程
中get
pid
()值与
子
进程
中getp
pid
()值不相同的问题及解释
父
进程
中get
pid
()值与
子
进程
中getp
pid
()值不相同的问题及解释 使用fork()创建一个新的
子
进程
,并调用get
pid
()与getp
pid
()查看
父
子
进程
之间的
pid
的关系。示例代码如下: #include "common.h" int main() {
pid
_t
pid
; if ( (
pid
= fork()) < 0 ) { perror("fork()");
exit
(1); } if (
pid
) { printf("parent process <
linux
父
进程
退出时如何确保
子
进程
退出?
子
进程
退出的时候,
父
进程
能够收到
子
进程
退出的信号,便于管理,但是有时候又需要在
父
进程
退出的时候,
子
进程
也退出,该怎么办呢?
父
进程
退出时,
子
进程
会如何? 一般情况下,
父
进程
退出后,是不会通知
子
进程
的,这个时候
子
进程
会成为孤儿
进程
,最终被init
进程
收养。我们先来看一下这种情况。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> int main(
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章