fork的问题

yfk
博客专家认证
2009-11-02 12:29:44
EMC的一个笔试题
How many processes are created in the following c program(Assume all forks return on sucdess)

#include <unistd.h>
int main()
{
fork();
fork() && fork() || fork();
fork();

}

我运行了一下,创建了19个新的进程,为什么,请牛人解释解释啊。
谢谢
...全文
337 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
steptodream 2009-11-02
  • 打赏
  • 举报
回复
进来学习
yfk 2009-11-02
  • 打赏
  • 举报
回复
非常感谢
yegoo 2009-11-02
  • 打赏
  • 举报
回复
学习了!~
tge7618291 2009-11-02
  • 打赏
  • 举报
回复
设用f表示fork(), 先推算出一些规律:
对于main中只有一个fork()的话, 显然创建的新进程只有1个, 如下表示:
f 1
有2个fork()的话:
ff 1+2 = 2^2-1 = 3 (第一个fork()创建一个; 第二个fork()被调用到两次, 一次
是main调用, 另一次是第一个fork()所产生的子进程调用; 共计3个进程被创建)

有3个fork()的话:
fff 1+2+4 = 2^3-1 = 7 (第一个fork()被调用1次, 第二个fork()被调用2次, 第三个
fork()被调用4次(一次main调用, 前两个fork()所产生的三个进程各调用一次)


有n个fork()的话:
f...f 1+2+...+2^(n-1) = 2^n-1


对于 fork() && fork() || fork(); 语句, 关键分析出其中的fork到底有没有被调用到.
0表示此处的fork()返回0, 1表示此处的fork()返回非0, E表示此处的fork()一定被执行
(当然, 表示为0或1的也就一定被执行了), -表示此处的fork()一定不被执行.
所以此条语句的执行情况为:
0 - E
1 1 -
1 0 E
从上图中, 我们可以看出, 第一个fork()被调用1次, 第二个fork()被调用1次, 第三个
fork()被调用2次, 所以此条语句共创建了4个新进程.

回到原问题上:
注意到: 4=3+1, 所以,
原问题可以分解为
__
(1) f|ff|f
--
_
(2) f|f|f
-
---
/
相对(1), 这部分已经重复了

所以, 最终结果为: 15+7-3=19
nevil 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yfkiss 的回复:]
引用 2 楼 nevil 的回复:
最关键是知道fork() && fork() || fork(); 这句话会有几个进程?答案是包括父进程会有5个。
其余的可以自己推了。


fork() && fork()这种如果第一个返回0,则就不会执行后面一个,只有第一个大于0才会执行后面一个
fork() || fork()这种如果第一个返回1,则就不会执行后面一个,只有第一个返回0才会执行后面一个
这个看来 fork() && fork() || fork()这句话的关系就是
                     父进程
                     |第一个fork
             ---------------------
          父进程              子进程1
            |第二个fork         |  不执行第二个fork,直接执行第三个fork
       -----------          --------
      父进程      子进程2    子进程1  子进程3
                   |第三个fork
                --------
              子进程2   子进程4

这样总数怎么会是19个呢?
[/Quote]

第一行的fork生成1个新进程
第二行的三个fork生成4+4=8个新进程
第三行的一个fork会生成10个新进程(这是因为前面总共有10个进程,调用一次fork生成10个新进程)

这样是不是19个新进程(不包括父进程)?
yfk 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nevil 的回复:]
最关键是知道fork() && fork() || fork(); 这句话会有几个进程?答案是包括父进程会有5个。
其余的可以自己推了。


fork() && fork()这种如果第一个返回0,则就不会执行后面一个,只有第一个大于0才会执行后面一个
fork() || fork()这种如果第一个返回1,则就不会执行后面一个,只有第一个返回0才会执行后面一个
这个看来 fork() && fork() || fork()这句话的关系就是
                    父进程
                    |第一个fork
            ---------------------
          父进程              子进程1
            |第二个fork        |  不执行第二个fork,直接执行第三个fork
      -----------          --------
      父进程      子进程2    子进程1  子进程3
                  |第三个fork
                --------
              子进程2  子进程4
[/Quote]
这样总数怎么会是19个呢?
nevil 2009-11-02
  • 打赏
  • 举报
回复
最关键是知道fork() && fork() || fork(); 这句话会有几个进程?答案是包括父进程会有5个。
其余的可以自己推了。


fork() && fork()这种如果第一个返回0,则就不会执行后面一个,只有第一个大于0才会执行后面一个
fork() || fork()这种如果第一个返回1,则就不会执行后面一个,只有第一个返回0才会执行后面一个
这个看来 fork() && fork() || fork()这句话的关系就是
父进程
|第一个fork
---------------------
父进程 子进程1
|第二个fork | 不执行第二个fork,直接执行第三个fork
----------- --------
父进程 子进程2 子进程1 子进程3
|第三个fork
--------
子进程2 子进程4

23,120

社区成员

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

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