和ctq讨论后,从这段代码理解了fork()函数。
运行结果如下:
从执行结果看,这段代码共产生了4个进程。
因为每执行一次fork(),会分裂成两个进程。也就是说,总的进程数关于fork()的调用次数成指数级增长。
第一步,“爷爷进程”(pid=7538)走到第10行,执行fork()。那么从此处分裂成两个进程。处理机调度爷爷进程(pid=7538),那么爷爷进程就接着10行往下执行。在此进程中,行10的fork()返回给7538爷爷进程的pid1为刚刚他生出的子进程的pid,即7539。接着,执行第11行,再次分裂,产生子进程7540,处理机还是先调度爷爷进程。爷爷进程执行第13行。
然后,爷爷进程被销毁。
处理机开始调度pid为7539的子进程,暂时称其为父亲进程(在三代进程中,相对而言)。该进程从第10行被创建的地方往下执行。由于该进程是被创建的子进程,所以在他内部,fork()返回给pid1的值为0。接着执行11行,分裂,产生新进程7541。先调度父亲进程7539,执行13行。由于它的父进程7538在前面已经被销毁,所以它被系统缺省进程pid=1领养。然后进程7539退出,销毁进程7539。
接着,调度进程7541。
最后,调度进程7540。分析同前面一样。
而输出结果中,爷爷进程7538的父进程7236,就是bash咯。这个通过终端$top -p 7236可以查到。