fork()&&fork()||fork()
2015-08-27 23:20
447 查看
先回忆一下fork()函数
由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。
1.在父进程中,fork返回新创建子进程的进程ID。
2.在子进程中,fork返回0。
3.如果出现错误,fork返回一个负值。
子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间,堆和栈的副本。注意,这是子进程所拥有的副本。父进程并不共享这些存储空间部分。父进程和子进程共享正文段。
第一题:
此程序共产生多少个进程?
共 20 个进程 ,fork 了 19个进程,剩余的那一个是执行一开始的进程。
先解释
A&&B||C
1.当A = 0 或者 B = 0时 ,直接判断 C ;
2.如果 A > 0,则要继续判断B是否大于0,如果B = 0,则判断 C,如果B > 0,判断结束;
3.如果 B > 0 ,同理 (2)。
如图(执行的是第二行的进程图)
父进程执行第一个fork,生成 父进程 和 子进程1 ,父进程返回的是子进程1的进程ID 是大于 0的,子进程返回的是 0。
于是,父进程执行第二个fork ,生成 父进程 和 子进程 2。而子进程由于返回的是0,则执行第3个fork,生成 子进程1 和 子进程3。(子进程1是子进程他爸)
父进程,子进程1 和 子进程 3 执行完毕。
子进程 2返回 0,于是执行第三个fork,生成 子进程2 和 子进程4。
子进程2 和 子进程4 执行完毕。
此程序进程图
看看对不对!
不算一开始执行的进程就是19个~~。
下面据说是腾讯校招题
这两个程序各输出多少个”_”?
1.c的答案是 8个
2.c的答案是6个
如果标准输出连到终端,则它是行缓冲;否则它是全缓冲的。
标准输出缓冲区由换行符(’\n’)冲洗。
1.c由于没有带(‘\n’)所以printf中的‘—’留在缓冲区中。最后每个进程的缓冲区都有2个‘—’。
2.c带了(‘\n’),每创建一个进程就printf(“_\n”)一次。
由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。
1.在父进程中,fork返回新创建子进程的进程ID。
2.在子进程中,fork返回0。
3.如果出现错误,fork返回一个负值。
子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间,堆和栈的副本。注意,这是子进程所拥有的副本。父进程并不共享这些存储空间部分。父进程和子进程共享正文段。
第一题:
#include <unistd.h> #include <stdio.h> int main() { fork();/*第一行*/ fork() && fork() || fork();/*第二行*/ fork();/*第三行*/ sleep(100); return 0; }
此程序共产生多少个进程?
共 20 个进程 ,fork 了 19个进程,剩余的那一个是执行一开始的进程。
先解释
fork()&&fork()||fork()//注释第二行
A&&B||C
1.当A = 0 或者 B = 0时 ,直接判断 C ;
2.如果 A > 0,则要继续判断B是否大于0,如果B = 0,则判断 C,如果B > 0,判断结束;
3.如果 B > 0 ,同理 (2)。
如图(执行的是第二行的进程图)
父进程执行第一个fork,生成 父进程 和 子进程1 ,父进程返回的是子进程1的进程ID 是大于 0的,子进程返回的是 0。
于是,父进程执行第二个fork ,生成 父进程 和 子进程 2。而子进程由于返回的是0,则执行第3个fork,生成 子进程1 和 子进程3。(子进程1是子进程他爸)
父进程,子进程1 和 子进程 3 执行完毕。
子进程 2返回 0,于是执行第三个fork,生成 子进程2 和 子进程4。
子进程2 和 子进程4 执行完毕。
此程序进程图
看看对不对!
不算一开始执行的进程就是19个~~。
下面据说是腾讯校招题
//1.c #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<unistd.h> int main(void) { int i; for(i = 0 ; i < 2; i++) { fork(); printf("_"); } return 0; }
//2.c #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<unistd.h> int main(void) { int i; for(i = 0 ; i < 2; i++) { fork(); printf("_\n"); } return 0; }
这两个程序各输出多少个”_”?
1.c的答案是 8个
2.c的答案是6个
如果标准输出连到终端,则它是行缓冲;否则它是全缓冲的。
标准输出缓冲区由换行符(’\n’)冲洗。
1.c由于没有带(‘\n’)所以printf中的‘—’留在缓冲区中。最后每个进程的缓冲区都有2个‘—’。
2.c带了(‘\n’),每创建一个进程就printf(“_\n”)一次。
相关文章推荐
- 两边点连直线求交点总数 树状数组或线段树 poj 3067 Japan
- easyui 之 datagrid动态列与列宽自适应
- KMP && AC自动机模板
- 2015.8.27
- 线段树 区间修改 总结
- Linux pkg-config命令
- 扩展方法
- Linux splint命令
- Activity的启动模式
- linux下的 fork vfork和clone函数
- 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则
- STM32 UART DMA实现未知数据长度接收
- iOS GCD多线程介绍
- openssl从PFX导出私钥、公钥
- do...while(0)的妙用
- 一个C语言典型的内存泄露问题
- Backdoor.Win32.Rbot病毒防治
- OC-@property增强使用
- haproxy根据客户端浏览器进行跳转
- Java基础の第一弹