日期:2014-05-16  浏览次数:20622 次

父子进程关系问题
1.子进程是否由父进程创建,子进程跑的程序和父进程有何关系,好像说fork()是完全复制一个,是不是说两者的程序完全一样,那样搞一个子进程有什么意义,还是说两者的程序可以不一样
2.子进程是否只能由父进程kill掉
3.如果父进程退出,是不是子进程一定退出

请高手详细指导下两者的关系,感谢!

------解决方案--------------------
1. 是,folk之后通过返回值可以判断到底是父进程还是子进程,从而你可以使父子进程分别走同一段代码的不同分支。
2. 否。
3. 否。但会有特殊处理。该子进程会成为孤儿,然后变成init的的子进程。
------解决方案--------------------
http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx

以前写过一篇,比较基础的。
耐心看。

你的第一个问题只能说明你是为了学多进程而学,其实你不需要的吗?
------解决方案--------------------
1.多进程的用处有很多。但有多少暂且不说,LINUX中,除了内核和init,所有的进程都是别人直接或间接创建的,所以如果没有fork以及类似的vfork/clone等,那linux基本就无法运行除init以外的程序了。至于是不是一定要做相同的事,完全看你的需求。你可以用if/else分支来控制让父子做完全不同的事,甚至子进程被fork之后,可以直接执行exec,启动另一个程序并覆盖掉从父进程那里继承而来的内存空间状态。
2.任何人,只要有权限都可以kill掉一个进程;
3.不是。但这种习惯不好,会造成僵尸进程。
------解决方案--------------------
1.父进应该可以和子进程程序不一样,因为我明确看到两个进程,父进程和子进程具有不同的程序文件。比如下面看到的进程,许多父进程都是pid都是1,但是每个都是各自不同的程序。我看到教材上说fork()是父进程创建子进程的唯一方式,并且fork()的意思其实就是“克隆”,也就是原样复制,那么这么说程序应该是一样的啊。不解。

估计你平时还不怎么用 fork写代码。

fork一个进程,一般是因为父进程遭遇阻塞或者多个任务需要执行,这个时候必须产生多个分支。

fork是克隆,但是克隆只是过程,手段,不是目的。
目的是解决并发的需求,克隆完你完全可以用子进程做不同的事情。
子进程跟父进程耦合关系很低的。

.父进程被杀掉,子进程是否一定同时被杀掉 

不会,不然那里还会有什么僵尸进程呢。

3.是否任何一个进程,只要有足够的权限,都可以将另一个进程杀掉。
既然是足够权限,当然得可以。
系统下的一切进程都是init进程的子进程。


楼主你的问题,书上都有答案,为何不看书呢?
至少也应该看看APUE.