深入了解计算机系统————fork()函数代码运行与部分理解

fork()函数说明:

定义: pit_t fork(void);(pit_t为宏定义,实际上是int类型)
说明: 一个进程可以调用fork()函数获得一个与之几乎完全相同的子进程,这个子进程拥有父进程的数据空间等资源的副本。但父子进程并不共享存储空间以及地址空间。调用一次fork()函数将会获得两次返回值,两次返回值不相同,子进程返回0,父进程返回子进程的id,出错则只有一个返回值为-1.

下面让我们来看几个实例:

fork0()

源代码如下:

深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:深入了解计算机系统————fork()函数代码运行与部分理解
说明:由上面的输出可知,该函数产生了两次输出,且父进程先执行(ps:不代表父进程一定比子进程先执行,先后顺序由调度器决定).

fork1()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:

深入了解计算机系统————fork()函数代码运行与部分理解说明:由上面的运行结果可以知道,父进程与子进程的pid是连着的,父进程的pid等于子进程的pid+1.

fork2()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解

运行结果如下:

深入了解计算机系统————fork()函数代码运行与部分理解说明:首先父进程进行输出L0,然后运行第一个fork(),产生一个子进程1,然后父进程输出L1,接着在第二个fork时又产生一个子进程2,同时在子进程1中也产生了一个子进程(1,2),然后父进程输出Bye,接着在父进程的子进程2中输出Bye,然后回到子进程1中,子进程1输出L1,接着跟父进程类似,输出Bye,Bye。

fork3()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:(ps:此处最后应该还有一个bye)
深入了解计算机系统————fork()函数代码运行与部分理解

fork4()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解

fork5()

源代码如下:

深入了解计算机系统————fork()函数代码运行与部分理解运行结果如下:深入了解计算机系统————fork()函数代码运行与部分理解

fork6()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解

fork7()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解运行结果如下:

深入了解计算机系统————fork()函数代码运行与部分理解
说明:这里,父进程并没有退出,所以导致程序一直在运行,成为僵尸(zombies.)进程,一直在后台运行,具体表现如下,无法在终端创建新程序,只有Ctrl+C或者Ctrl+Z退出此程序才可以进行新的操作。

fork8()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解

fork9()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解
运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解
说明:进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

fork10()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解

fork11()

源代码如下:
深入了解计算机系统————fork()函数代码运行与部分理解运行结果如下:
深入了解计算机系统————fork()函数代码运行与部分理解