等待和退出实际上是父子进程之间的一种交互,完成子进程的资源回收。
进程等待
wait()系统调用可以用于父进程等待子进程的结束:
关于wait()的实现,实际上是把进程的状态改为 sleep;
- 子进程结束时通过exit()向父进程返回一个值;
- 父进程通过wait()接受并处理返回值。
那么这两者谁先发生呢?先后顺序有什么影响?
1. 当有子进程存活时,父进程进入等待状态,等待子进程的返回结果;当某子进程调用exit()时,唤醒父进程,将exit()返回值作为父进程中wait()的返回值。此时,wait在前,exit在后。
2. 有僵尸子进程等待时,wait()立即返回其中一个值。此时exit()在前,子进程调用exit()来等待父进程处理,父进程的wait()会立即返回这个子进程的值。
exit()是进程在结束时,用它来完成进程资源回收,终止进程的。
exit()的功能:
- 将调用参数作为进程的“结果”返回给父进程,方便父进程使用;
- 资源回收:如打开的文件、分配的内存、释放大部分进程相关的内核数据结构;
- 检查父进程是否还存活:子进程在执行exit()的时候检查父进程,父进程是在执行wait()时检查子进程。如果存活,那就保留结果直到父进程需要它,子进程进入僵尸状态;如果父进程已经死了,那就释放所有的数据结构和进程结果;
- 在上一步检查做完之后,会清理所有等待的僵尸进程;
总的来说就是释放资源 -> 把自己的状态改为僵尸状态 -> 唤醒处于wait状态的父进程回收自己 -> 让处理机切换到其他进程