关于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函数的小结,大家可以提出我对不足,或讲一件自己的看法,我们可以讨论一下,扬长补短,谢谢大家!

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐