目录
1. fork
2. fork面试题
3.僵死进程
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()这一行,正常结束才会有退出码,如果是程序异常崩溃则不会有退出码



