笔试面试——fork()
来源:互联网 发布:淘宝上解id锁是真的吗 编辑:程序博客网 时间:2024/04/30 07:17
转载:http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html
到fork将程序切成两段.
上图表示一个含有fork的程序,而fork语句可以看成将程序切为A、B两个部分。然后整个程序会如下运行:
step1、设由shell直接执行程序,生成了进程P。P执行完Part. A的所有代码。
step2、当执行到pid = fork();时,P启动一个进程Q,Q是P的子进程,和P是同一个程序的进程。Q继承P的所有变量、环境变量、程序计数器的当前值。
step3、在P进程中,fork()将Q的PID返回给变量pid,并继续执行Part. B的代码。
step4、在进程Q中,将0赋给pid,并继续执行Part. B的代码。
这里有三个点非常关键:
1、P执行了所有程序,而Q只执行了Part. B,即fork()后面的程序。(这是因为Q继承了P的PC-程序计数器)
2、Q继承了fork()语句执行时当前的环境,而不是程序的初始环境。
3、P中fork()语句启动子进程Q,并将Q的PID返回,而Q中的fork()语句不启动新进程,仅将0返回。
面试题:
给出如下C程序,在linux下使用gcc编译:
#include "stdio.h"
#include "sys/types.h"
#include "unistd.h"
int
main()
{
pid_t pid1;
pid_t pid2;
pid1 = fork();
pid2 = fork();
printf(
"pid1:%d, pid2:%d\n"
, pid1, pid2);
}
要求如下:
已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。
1、请说出执行这个程序后,将一共运行几个进程。
2、如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。
答案:1、一共执行了四个进程。(P0, P1, P2, P3)
2、另外几个进程的输出分别为:
pid1:1001, pid2:0
pid1:0, pid2:1003
pid1:0, pid2:0
进一步可以给出一个以P0为根的进程树:
- 笔试面试——fork()
- 公司笔试题——fork
- 某公司笔试题——Linux fork()
- 【笔试/面试】—— 网络
- 【面试/笔试】—— 数学
- 笔试面试—Linux操作系统
- fork() || fork()和fork() && fork()笔试题
- fork() || fork()和fork() && fork()笔试题
- fork() || fork()和fork() && fork()笔试题
- 笔试面试——java基础知识
- 【笔试&面试】GSC——Java开发
- Android——面试笔试集锦
- 收藏夹整理——程序员笔试面试
- 4399笔试&&面试——感受
- 【面试笔试复习笔记】——计算机网络
- 【面试笔试复习笔记】——数据库
- 【笔试/面试】—— linux(rpm)
- java笔试+面试总结——mysql
- Linux ubuntu下svn的命令使用指南
- 在Linux上配置PySpark
- VC6.0如何插入条件断点
- Android中SharedPreferences用法
- iOS UIPageViewController模仿真实翻页效果
- 笔试面试——fork()
- Spring 事务管理 DataSourceTransactionManager 和 DataSourceTransactionManager
- HDU-1501 (POJ-2192) Zipper (DFS||DP)
- 下拉列表框Spinner
- [疯狂Java]JDBC:用blob处理多媒体类型数据
- Codeforces 345 div1
- IosApp开发简单实例
- Code Forces 645B Mischievous Mess Makers
- 使用maven自动打包android应用签名后报错:INSTALL_PARSE_FAILED_NO_CERTIFICATES