
fork的意思是个叉子,在unix及其衍生版Linux中,用于创建子进程,现在看一下fork函数的基本用法。
#include
上图的输出是什么呢?
答案是:BABCCCC或ABCBCCC,由于进程的调度,顺序有所不同,但是每个字母的个数却是一定的。
为什么会输出上述字母?
首先说一下fork()函数的基本概念吧,fork函数是一个系统调用,说到系统调用,就是Linux内核提供给上层应用使用的。fork函数的作用是创建一个子进程,并且和父进程运行同样的代码。
这里有个注意点,就是和父进程运行同样的代码。这样用叉子来形容这个函数非常的恰当。从fork函数往后,两个进程就分开了,然后运行同样的代码。
另外一个注意点是fork函数的返回值,如果是父进程,返回值为子进程的PID,如果是子进程运行fork,则返回值为0,这样就可以区分是父进程还是子进程了。
了解了上述fork函数的定义,我们就回归到上述代码。
首先主进程运行main函数,来到if(!fork),此刻开始创建子进程,并且两个子进程运行同样的后续代码。
父进程:父进程运行if(!fork)判断,条件不成立,则略过打印A的代码段,输出B,然后继续往后运行,遇到fork,父进程和子进程同时运行后续代码,也就是父进程输出C,子进程输出C。
子进程:子进程运行if(!fork)判断,条件成立,输出A,然后运行B,然后继续运行到fork,创建子进程,和主进程运行一样的代码,也就是主进程输出C,子进程输出C。
由于调度原因,子进程,父进程调度顺序不停,所以序列不通,但是各个字母的个数是确定的。
BCCABCC