Linux进阶---第二篇

 

目录

1. fork

2. fork面试题        

3.僵死进程


1. fork

1)fork复制进程后,父子进程并发运行

2)获取pid

pid_t   getpid(void)

获取当前进程的pid号

pid_t   getppid(void)

获取当前进程---父进程的pid号

Linux进阶---第二篇_第1张图片

3)命令解释器

Linux进阶---第二篇_第2张图片

 

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

Linux进阶---第二篇_第3张图片

 为什么呢?

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

Linux进阶---第二篇_第4张图片

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

5)

Linux进阶---第二篇_第5张图片

父进程和子进程有一个相同的变量n,他们的地址相同,但是值不同

此时 父进程中的n和子进程中的n是同一个n吗?

由于子进程是由父进程fork复制的,所以子进程和父进程的逻辑地址相同,但是父进程和子进程是相互独立的两个进程,他们的所占用的内存空间不在同一块内存区域,也就是说父进程和子进程的物理地址不同

 程序中使用的地址是逻辑地址

 fork复制是将父进程的地址空间复制一份给子进程

2. fork面试题        

1)

Linux进阶---第二篇_第6张图片

2)

Linux进阶---第二篇_第7张图片

3)

Linux进阶---第二篇_第8张图片

3.僵死进程

Linux进阶---第二篇_第9张图片

那么父进程一定是先结束

Linux进阶---第二篇_第10张图片

bash只知道执行 ./main程序 ,而不管 ./main中产生的子进程,./main执行结束提示符出现

当父进程执行结束,他的子进程被称为 孤儿进程,系统专门有一个init进程用于收养这些孤儿进程

Linux进阶---第二篇_第11张图片

 pid1324就是init进程

当子进程结束时:

Linux进阶---第二篇_第12张图片

 所以当子进程的父进程结束,子进程必须要有一个父进程去接受子进程结束时返回的退出码,然后去释放子进程的PCB,因此这些孤儿进程都必须要让init进程去处理他们执行结束后的善后工作

 

当子进程先结束后,父进程没有获取退出码,此时该进程就处于僵死状态,进而被称为僵死进程

被init进程收养的孤儿进程一定不会变成僵死进程,init进程一定会获取这些孤儿进程的退出码

Linux进阶---第二篇_第13张图片

 父进程通过调用wait()获取子进程的退出码,来处理僵死进程

 只有程序执行到exit()这一行,正常结束才会有退出码,如果是程序异常崩溃则不会有退出码

你可能感兴趣的:(Linux,linux)