有意思的进程创建函数fork() && fork() || fork() .
来源:互联网 发布:nba2k16球员详细数据 编辑:程序博客网 时间:2024/04/29 23:57
OK,我们看一道有意思的问题:
#include<STDIO.H>
int
main()
{
fork();
fork()&&fork()||fork();
fork();
}
请问有多少个进程?
这是EMC的一道笔试题,感觉挺有意思的,这道题主要考了两个知识点,一是逻辑运算符运行的特点;二是对fork的理解
如果有一个这样的表达式:cond1 && cond2 || cond3 这句代码会怎样执行呢?
1、cond1为假,那就不判断&&后面的了
2、cond1为真,这又要分为两种情况:
a、cond2为真,这就不需要判断cond3了
b、cond2为假,那还得判断cond3
fork调用的一个奇妙之处在于它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1、在父进程中,fork返回新创建子进程的进程ID;
2、在子进程中,fork返回0;
3、如果出现错误,fork返回一个负值(题干中说明了不用考虑这种情况)
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程
分析:解决这个问题主要注意三点:1.子进程是从fork后面那个指令开始执行的;2.fork父子进程的不同返回值;3对于"a&&b"如果a为0,那么不会再执行b。
用语言来描述实在是太复杂,上一张,希望读者能够看懂:
最后的进程总数看有多少个节子点就行了。很明显一共是20个。关键点就是在树的第三层,C和D都是子进程,那么它俩返回的值都是0,因此"&&"后面的表达式就不会执行,之后执行最后一个fork()函数。但是A和B两个父进程返回值大于0,因此会执行后面的"fork()||fork()"。分析结束
另外一种思路
下面我们来分析fork() && fork() || fork()会创建几个新进程
很明显fork() && fork() || fork()创建了4个新进程
总结:
第一注释行的fork生成1个新进程
第二注释行的三个fork生成4+4=8个新进程
第三注释行的ork会生成10个新进程(这是因为前面总共有10个进程,调用一次fork生成10个新进程)
所以一共会生成1+8+10=19个新进程
- 有意思的进程创建函数fork() && fork() || fork() .
- 有意思的进程创建函数fork()的问题
- fork函数创建进程
- 创建进程-fork函数
- Linux创建进程的fork()函数
- 进程创建函数fork()、vfork()
- 进程创建,fork()函数讲解
- Linux进程创建fork()函数
- 进程的创建: fork/execve
- 【Linux】进程的创建fork()
- 创建守护进程fork一次与fork两次的区别
- 创建进程fork
- 创建进程库函数fork
- fork() 创建新进程
- 创建进程库函数fork
- python 创建进程fork
- fork创建子进程
- fork创建进程
- 怎样去理解信息时代的社群圈子?
- 连锁店统一店铺音乐解决方案_总部集中管控
- android viewpage 收藏
- NSIS Script简介
- Android 性能调优点
- 有意思的进程创建函数fork() && fork() || fork() .
- 失败的原因
- 序
- 欢迎使用CSDN-markdown编辑器
- 【iOS学习笔记】中将事件添加到系统日历
- VC编程实现色彩空间RGB与HSB(HSV)相互转换
- visio画UML用例图没有include关系的解决方法(转)
- js 300代码示例
- spring学习笔记(9)——bean的生命周期