关于fork的详细解释
fork是Linux中用来创建与父进程相同子进程的系统调用函数,他创建一个原有进程的精确副本,包括所有的文件描述符,寄存器等全部内容。在fork之后,原有的进程及其副本(父与子)就分开了。在fork时,所有的变量具有一样的值,虽然父进程的数据被复制用以创建子进程,但是其中一个的后续变化并不会影响到另一个,两个进程就是独立个体,各自运行,互不干扰,父子进程谁先执行不由fork决定,而是由系统当前环境和进程调度算法决定,所以程序出来结果的顺序是不确定的。
子进程是从调用fork以后的代码开始执行的,fork调用一次会返回两个值,其中在子进程中返回0,在父进程中返回子进程的pid号。
下面给大家举三个例子:
程序一:
同学们,可以先根据程序,并依据我上面所说的知识点,猜测一下运行结果
最后运行的结果是:
我们可以看到程序既输出了world,又输出了hello,而其中world和hello分别是同一个if函数中if和else中的值,不可能同时打出,那现在竟然出现了这样的结果,是什么原因呢?
其实,正如我们上面所说,子进程是从调用fork以后的代码开始执行的,fork调用一次会返回两个值,其中在子进程中返回0,在父进程中返回子进程的pid号,父进程中的返回值是非0值,因此父进程打出world,而子进程中因为返回值是0,因此打出hello,所以既打出了world又打出了hello,但调用fork结束以后,两个进程就是独立个体,各自运行,互不干扰,父子进程谁先执行不由fork决定,而是由系统当前环境和进程调度算法决定,因此根据个人系统情况不同,打出world和hello的顺序不一定一致,我们只能确定运行出来的结果,但没办法确定运行结果出来的顺序。
程序二:
运行结果:
这个程序,比上面的程序复杂一些,因此,我给大家画图进行讲解。
因此,结果是“A”,“B”,“B”。
程序三:
运行过程:
这个过程也较为复杂,我也画图解释。
它的结果是BBABAA,顺序不能确定,因为这是根据系统当前环境和进程调度算法决定。
以上是我对fork函数的小结,大家可以提出我对不足,或讲一件自己的看法,我们可以讨论一下,扬长补短,谢谢大家!
来自 https://blog.csdn.net/weixin_42736024/article/details/81412962