当前位置:   article > 正文

我有一万种方法让你对系统调用 - fork 了如指掌

我有一万种方法让你对系统调用 - fork 了如指掌

1、认识并使用fork

  我们知道fork是一个系统调用函数,其作用是创建子进程。这个fork有许多细枝末节的难点和知识点需要我们学习并熟练掌握,我们接下来将采用代码实验的方法,深入学习fork的一些操作和难点。

1.1 查看fork使用手册
在这里插入图片描述
在这里插入图片描述

  fork函数其返回值是一个pid_t类型的值,说白了就是一个无符号整型unsigned int,其形参为void,说明不用传任何参数。函数调用成功给父进程返回创建子进程的pid,并给子进程返货0,创建失败返回-1。

1.2 使用fork
  写一段代码来感受一些fork的作用及返回值。

图一:程序代码
图二:实验结果
代码和运行结果如上图:当我们调用fork时:这时打印出了两个进程的pid和ppid。其中pid为18980的进程是我们自己的进程,pid为18981的进程是我们创建出来的子进程,其父进程就是18980, 说明这两个进程是父子关系。

  像我们下面的代码,printf(“I am running…\n”);是哪一个进程执行的?答案是当前进程,即上面的父进程,因为 fork是创建子进程,创建子进程的前提是我自己这个进程要先运行,printf是在子进程创建之前运行,也是当前进程执行。所以fork之前的代码是父进程执行,fork之后的代码(图里的while)默认是父子都可执行的。
在这里插入图片描述
1.3 fork两个返回值的使用
  fork函数会有两次返回值,给父进程返回子进程的pid,给子进程返回0。我们可以根据fork()的这一特点来完成多执行流的运行。我们之前的时候,像if-else这种多分支判定永远只能有一个执行流,if和else if是不可能同时执行的,但是现在在这里,是可以的。

图一:程序代码
图二:实验结果
  这样,我们就可以把子进程和父进程做的事情分离了。他们是同时进行的,但是如果是单核CPU,他们还是不断进行切换的。

在这里插入图片描述

2、深入了解fork的底层

  我们知道,fork是创建子进程,子进程也是一个新的进程,也是要被操作系统管理的,操作系统管理进程是要先描述再组织,描述就是将进程的各种信息封装成数据结构,管理就是操作系统对进程的管理就变成了对集成的数据结构的管理,这就是操作系统四大功能之一进程管理的本质。
  那么,fork()创建子进程的过程,OS做了什么?操作系统要为子进程创建其自己的数据结构,包括PCB - task-struct,进程地址空间 - mm_struct,页表、文件系统等等,并且子进程的数据和代码来源就是父进程,所以fork后父子进程才能同时执行父进程原有的代码。

2.1 fork为何要给子进程返回0,给父进程返回子进程的pid
  在现实世界中,任何一个小孩都只有一个父亲,但是一个父亲可以对应多个小孩,所以 父:孩 = 1:n 。对于父亲来说,回到家面对多个孩子肯定要具体到人名,而孩子却不需要,只需要叫爸,即父子进程立场: 父进程不需要标识,子进程需要标识。
  我们fork一个子进程是要子进程执行任务,父进程需要区分子进程,而子进程不需要,因此 我们需要给父进程返回子进程的pid本质就是父进程需要通过pid区分子进程。 子进程不需要返回父进程,不需要知道父进程是谁,因为任务是父进程给他的,他只需要知道自己调用成功与否就可以,因此给自己返回0。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/210179
推荐阅读
相关标签