从一道面试题谈linux下fork的运行机制

记得有一次,我在实验室里,和同学一起调试一个多进程的程序。
我们用C语言写了个简单的进程创建脚本,用fork()函数来创建子进程。
当时,我们运行了这个程序,结果屏幕上出现了一串奇怪的数字和字母。

我盯着屏幕,pid1 :1 001 ,pid2 :0,然后是pid1 :0,pid2 :1 003 ,还有pid1 :0,pid2 :0。
我一开始有点懵,后来仔细一看,发现每个数字后面都跟着一个进程ID。
我突然想到,这不就是fork()函数的返回值吗?我赶紧查了查资料,原来fork()函数在父进程中返回子进程的PID,而在子进程中返回0。

我们分析了代码,发现P0进程先执行了pid1 =fork(),创建了子进程P1 (PID=1 001 )。
然后P0又执行了pid2 =fork(),创建了子进程P2 (PID=1 002 )。
P1 也执行了pid2 =fork(),创建了子进程P3 (PID=1 003 )。
这样,一共运行了四个进程。

我仔细对照着输出结果,发现P0的输出是pid1 :1 001 ,pid2 :1 002 ,P2 的输出是pid1 :1 001 ,pid2 :0,P1 的输出是pid1 :0,pid2 :1 003 ,P3 的输出是pid1 :0,pid2 :0。
原来,每个进程都继承了父进程的状态,包括变量值。

我自言自语道:“等等,还有个事,我突然想到,fork()函数的返回值在父进程中是子进程的PID,在子进程中是0,这个机制真是太巧妙了。
” 我们继续调试,最后成功理解了整个进程的创建过程和输出结果。

Linux面试全攻略:题目汇总+详细解答,学习提升必备宝典!

这Linux面试资料,真全!基础到高级,1 4 2 道题,直接用。

一、特点就是全,管理、网络、脚本、安全啥都有。
分基础、进阶、高级,知识点一条龙。

比如,基础题教文件权限,进阶题学LVM卷管理,高级题内核参数调优,高级!
结构化设计,想查啥直接找,流程图一看就明白。

二、题目解答直接上,基础题怎么改权限,进阶题怎么搞SSH免密,高级题怎么优化系统,操作步骤全在这儿。

三、学习建议也实在,初学者先弄文件操作,有经验了学脚本和监控,实战模拟,开源项目搞起来。

资料直接领,链接一搜,打印出来,用Markdown工具记笔记,知识留得住。
你自己看,够用了吧?