父子进程关系问题

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

请高手详细指导下两者的关系,感谢!
...全文
1901 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗小城 2012-08-28
  • 打赏
  • 举报
回复
一个现存进程调用fork()函数是创建子进程的唯一方法[Quote=引用 3 楼 的回复:]
我觉得第一个问题问得很好,我没能意识到,差距。

我想可以反过来问,除了系统启动的那段特殊时期启动的几个进程,在系统正常运行的情况下,如何产生一个新的进程?
[/Quote]
yuesheng3707 2009-09-10
  • 打赏
  • 举报
回复
你的博客写的很好 我早就看过了[Quote=引用 2 楼 hairetz 的回复:]
http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx

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

你的第一个问题只能说明你是为了学多进程而学,其实你不需要的吗?
[/Quote]
rainbowbaby 2009-09-10
  • 打赏
  • 举报
回复
linux的哲学问题,建议你除了看2楼的文章外,要看看《unix环境高级编程》
wangzhanchuan 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx

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

你的第一个问题只能说明你是为了学多进程而学,其实你不需要的吗?
[/Quote]

void print_exit()
{
printf("the exit pid:%d\n",getpid() );
}

main ()
{
pid_t pid;
atexit( print_exit ); //注册该进程退出时的回调函数
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
{
printf("i am the parent process, my process id is %d\n",getpid());
sleep(2);
wait();
}

}
i am the child process, my process id is 15806
the exit pid:15806
i am the parent process, my process id is 15805
the exit pid:15805

这是gcc测试下的运行结果。

注册的进程退出时执行的函数是在进程退出后执行的还是退出前执行的?如果是进程退出后执行的,为什么打印的PID都是15805?
once_and_again 2009-09-08
  • 打赏
  • 举报
回复


fork() 是创建 新 的进程,


execl()系列 是 取代原来的进程?
  • 打赏
  • 举报
回复
1.父进应该可以和子进程程序不一样,因为我明确看到两个进程,父进程和子进程具有不同的程序文件。比如下面看到的进程,许多父进程都是pid都是1,但是每个都是各自不同的程序。我看到教材上说fork()是父进程创建子进程的唯一方式,并且fork()的意思其实就是“克隆”,也就是原样复制,那么这么说程序应该是一样的啊。不解。

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

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

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

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

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

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


楼主你的问题,书上都有答案,为何不看书呢?
至少也应该看看APUE.
heronism 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 heronism 的回复:]
1.子进程是否由父进程创建,子进程跑的程序和父进程有何关系,好像说fork()是完全复制一个,是不是说两者的程序完全一样,那样搞一个子进程有什么意义,还是说两者的程序可以不一样
2.子进程是否只能由父进程kill掉
3.如果父进程退出,是不是子进程一定退出

请高手详细指导下两者的关系,感谢!
[/Quote]
1.父进应该可以和子进程程序不一样,因为我明确看到两个进程,父进程和子进程具有不同的程序文件。比如下面看到的进程,许多父进程都是pid都是1,但是每个都是各自不同的程序。我看到教材上说fork()是父进程创建子进程的唯一方式,并且fork()的意思其实就是“克隆”,也就是原样复制,那么这么说程序应该是一样的啊。不解。
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:40 ? 00:00:08 init [3]
root 2 1 0 10:40 ? 00:00:00 [ksoftirqd/0]
root 3 1 0 10:40 ? 00:00:00 [desched/0]
root 4 1 0 10:40 ? 00:00:00 [events/0]
root 5 1 0 10:40 ? 00:00:00 [khelper]
root 10 1 0 10:40 ? 00:00:00 [kthread]
root 32 10 0 10:40 ? 00:00:00 [kblockd/0]
root 63 10 0 10:40 ? 00:00:00 [pdflush]
root 64 10 0 10:40 ? 00:00:00 [pdflush]
root 65 1 0 10:40 ? 00:00:00 [kswapd0]
root 66 10 0 10:40 ? 00:00:00 [aio/0]
root 67 1 0 10:40 ? 00:00:00 [jfsIO]
2.父进程被杀掉,子进程是否一定同时被杀掉
3.是否任何一个进程,只要有足够的权限,都可以将另一个进程杀掉。
zkuang82 2009-09-03
  • 打赏
  • 举报
回复
1. 是,folk之后通过返回值可以判断到底是父进程还是子进程,从而你可以使父子进程分别走同一段代码的不同分支。
2. 否。
3. 否。但会有特殊处理。该子进程会成为孤儿,然后变成init的的子进程。
晨星 2009-09-03
  • 打赏
  • 举报
回复
1.多进程的用处有很多。但有多少暂且不说,LINUX中,除了内核和init,所有的进程都是别人直接或间接创建的,所以如果没有fork以及类似的vfork/clone等,那linux基本就无法运行除init以外的程序了。至于是不是一定要做相同的事,完全看你的需求。你可以用if/else分支来控制让父子做完全不同的事,甚至子进程被fork之后,可以直接执行exec,启动另一个程序并覆盖掉从父进程那里继承而来的内存空间状态。
2.任何人,只要有权限都可以kill掉一个进程;
3.不是。但这种习惯不好,会造成僵尸进程。
bourbaki 2009-09-03
  • 打赏
  • 举报
回复
hairetz,看了你对多进程的blog,有个问题探讨一下。你说了为什么要多进程,那么为什么需要进程呢?为什么要引入这个概念?
bourbaki 2009-09-03
  • 打赏
  • 举报
回复
我觉得第一个问题问得很好,我没能意识到,差距。

我想可以反过来问,除了系统启动的那段特殊时期启动的几个进程,在系统正常运行的情况下,如何产生一个新的进程?
  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx

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

你的第一个问题只能说明你是为了学多进程而学,其实你不需要的吗?

19,613

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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