目录
1. fork
1)fork复制进程后,父子进程并发运行
2)获取pid
pid_t getpid(void)
获取当前进程的pid号
pid_t getppid(void)
获取当前进程—父进程的pid号

3)命令解释器

4)在下图我们可知 ./main的父进程是bash(命令解释器)

为什么呢?
在执行./main这个可执行程序时,我们的先把bash—fork复制一份,然后再把main程序替换进去

任何一个进程都会有它的父进程
5)

父进程和子进程有一个相同的变量n,他们的地址相同,但是值不同
此时 父进程中的n和子进程中的n是同一个n吗?
由于子进程是由父进程fork复制的,所以子进程和父进程的逻辑地址相同,但是父进程和子进程是相互独立的两个进程,他们的所占用的内存空间不在同一块内存区域,也就是说父进程和子进程的物理地址不同
程序中使用的地址是逻辑地址
fork复制是将父进程的地址空间复制一份给子进程
2. fork面试题
1)

2)

3)

3.僵死进程

那么父进程一定是先结束

bash只知道执行 ./main程序 ,而不管 ./main中产生的子进程,./main执行结束提示符出现
当父进程执行结束,他的子进程被称为 孤儿进程,系统专门有一个init进程用于收养这些孤儿进程

pid1324就是init进程
当子进程结束时:

所以当子进程的父进程结束,子进程必须要有一个父进程去接受子进程结束时返回的退出码,然后去释放子进程的PCB,因此这些孤儿进程都必须要让init进程去处理他们执行结束后的善后工作
当子进程先结束后,父进程没有获取退出码,此时该进程就处于僵死状态,进而被称为僵死进程
被init进程收养的孤儿进程一定不会变成僵死进程,init进程一定会获取这些孤儿进程的退出码

父进程通过调用wait()获取子进程的退出码,来处理僵死进程
只有程序执行到exit()这一行,正常结束才会有退出码,如果是程序异常崩溃则不会有退出码

本文详细介绍了fork函数在创建进程时的运作机制,包括父子进程的逻辑与物理地址区别。同时,讨论了面试中常见的fork相关问题。接着,阐述了僵死进程的概念,当父进程结束而子进程仍在运行时,子进程成为孤儿进程,由init进程接管。若子进程先结束而父进程未接收退出码,会产生僵死状态。解决僵死进程的方法是父进程调用wait获取子进程退出码。

被折叠的 条评论
为什么被折叠?



