LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 972|回复: 9

菜鸟请教:fork得到的pid在什么范围内是唯一的?

[复制链接]
发表于 2005-10-11 17:03:42 | 显示全部楼层 |阅读模式
大概题目比较含混,我仔细描述一下:

我有一个有操作界面的应用程序,含有一个help button。
在点击help button之后,程序会fork一个进程,运行mozilla之类的browser,显示help信息。

现在这个help进程在关闭应用程序时不会随父进程退出。

我想再fork是保留它的pid,这样在父进程退出时,可以先判断这个子进程是否还存在(因为可以随时关掉这个browser),如果还在,就kill它再退出主程序。

但是我不知道,如果我在退出应用程序之前,先关闭了browser(我保留了的pid),而后面又开启了其他别的进程,是否有可能会占用那个我保留的pid?这样我就会错误地kill掉一些进程?

如果有这种风险,还有别的方法吗?

万分感谢!
发表于 2005-10-11 17:37:54 | 显示全部楼层
有这个风险,但我认为你不需要在主程序退出时杀掉浏览器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-11 17:51:32 | 显示全部楼层
~{E6#,P;#!~}
~{NR;9OkGk=LR;OB#:~}

~{OVTZNR5D3LPrJG#,Hg9{Ub8v~}browser~{RQ>-?*Ft#,5+JGJGWnP!;/W4L,!#UbJ1#,NR5c;w~}help button~{#,KdH;2;;a3vOVVX845D~}browser~{40?Z#,5+JGT-@45D40?ZR22;;aWT6/Wn4s;/#,2"OTJ>TZWnG06K!#~}

~{Hg9{NROkJ5OVUb8vP'9{#,R*TuQyH%EP6OT-@4RT?*Ft5D~}browser~{=x3L5D#(M(9}~}pid~{;9JGSP7gOU0I#?#)#?~}
~{TuC4Qy0Q4fTZ5D40?ZWn4s;/#?~}

~{P;#!~}
回复 支持 反对

使用道具 举报

发表于 2005-10-12 01:23:55 | 显示全部楼层
pid是不断增长的
所以一般来说大的pid就是后运行的
不过增大到下面这个文件里指定的值之后就又从头开始了
/proc/sys/kernel/pid_max

所以有一定的风险,虽然比较小
回复 支持 反对

使用道具 举报

发表于 2005-10-12 17:22:46 | 显示全部楼层
同意zhllg, 好像达到了65535 之后才从0开始.

另外, "如果我在退出应用程序之前,先关闭了browser(我保留了的pid)",
子进程先于父进程退出时, 如果父进程没有显示的WAIT它, 则子进程会一直僵死在那里, 直到父进程WAIT它, 或父进程正常退出. 所以, 你有必要在父进程中处理 SIGCHLD信号(子进程退出),在处理函数中把当初保存的子进程PID清掉. 这样就OK了.
回复 支持 反对

使用道具 举报

发表于 2005-10-12 17:26:45 | 显示全部楼层
然后可以在主程序的 atexit 函数中检查子进程PID, 如果有效, 则KILL之.
回复 支持 反对

使用道具 举报

发表于 2005-10-12 18:45:39 | 显示全部楼层
首先,我同意上面的观点:
子进程先于父进程退出时, 如果父进程没有显示的WAIT它, 则子进程会一直僵死在那里, 直到父进程WAIT它, 或父进程正常退出.

但是,没有必要退出时去杀死子进程。
理由:fork两次之后,子进程退出(当然这个还是要马上就WAIT的),孙进程就变为孤儿,由INIT接管,不会僵死。
回复 支持 反对

使用道具 举报

发表于 2005-10-12 20:05:26 | 显示全部楼层
Post by 弥敦路九号
同意zhllg, 好像达到了65535 之后才从0开始.

为了和旧的UNIX保持兼容,这个值在vanilla kernel里默认是32768
回复 支持 反对

使用道具 举报

发表于 2005-10-13 13:33:47 | 显示全部楼层
To kiron:
楼主的意思并不是怕子进程没人管, 而是从业务角色讲需要在程序关闭时一并关掉打开的帮助窗口。
回复 支持 反对

使用道具 举报

发表于 2005-10-13 17:49:13 | 显示全部楼层

理解错误.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表