深入了解计算机系统————fork()函数代码运行与部分理解
fork()函数说明:
定义: pit_t fork(void);(pit_t为宏定义,实际上是int类型)
说明: 一个进程可以调用fork()函数获得一个与之几乎完全相同的子进程,这个子进程拥有父进程的数据空间等资源的副本。但父子进程并不共享存储空间以及地址空间。调用一次fork()函数将会获得两次返回值,两次返回值不相同,子进程返回0,父进程返回子进程的id,出错则只有一个返回值为-1.
下面让我们来看几个实例:
fork0()
源代码如下:
运行结果如下:
说明:由上面的输出可知,该函数产生了两次输出,且父进程先执行(ps:不代表父进程一定比子进程先执行,先后顺序由调度器决定).
fork1()
源代码如下:
运行结果如下:
说明:由上面的运行结果可以知道,父进程与子进程的pid是连着的,父进程的pid等于子进程的pid+1.
fork2()
源代码如下:
运行结果如下:
说明:首先父进程进行输出L0,然后运行第一个fork(),产生一个子进程1,然后父进程输出L1,接着在第二个fork时又产生一个子进程2,同时在子进程1中也产生了一个子进程(1,2),然后父进程输出Bye,接着在父进程的子进程2中输出Bye,然后回到子进程1中,子进程1输出L1,接着跟父进程类似,输出Bye,Bye。
fork3()
源代码如下:
运行结果如下:(ps:此处最后应该还有一个bye)
fork4()
源代码如下:
运行结果如下:
fork5()
源代码如下:
运行结果如下:
fork6()
源代码如下:
运行结果如下:
fork7()
源代码如下:
运行结果如下:
说明:这里,父进程并没有退出,所以导致程序一直在运行,成为僵尸(zombies.)进程,一直在后台运行,具体表现如下,无法在终端创建新程序,只有Ctrl+C或者Ctrl+Z退出此程序才可以进行新的操作。
fork8()
源代码如下:
运行结果如下:
fork9()
源代码如下:
运行结果如下:
说明:进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
fork10()
源代码如下:
运行结果如下:
fork11()
源代码如下:
运行结果如下: