我们知道,wait()和waitpid()都是进程等待的函数,那么为什么要进行进程等待呢?
进程等待的必要性
子进程退出时,父进程如果不管不顾,那么子进程就会变成僵尸进程,造成内存泄漏
如果进程变成僵尸进程,那么连kill -9都无法干掉进程,因为谁都无法杀死一个1已经退出的进程
这是因为子进程需要保存自己的进程状态,需要告诉父进程你交给我的任务完成的怎么样了,而这些信息就保存在PCB中,如果父进程不管这些信息,那么操作系统就要一直保留着这些信息,也就造成了僵尸进程
这也就有了进程等待的必要性,父进程通过进程等待获取子进程退出信息,回收子进程资源
wait()方法
pid_t wait(int*status);
成功返回被等待进程pid,失败返回-1
参数:输出型参数,获取子进程推出状态,不关心可以设置为NULL
witpid()方法
pid_ t waitpid(pid_t pid, int *status, int options);
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:pid = -1;等待任意一个子进程、 pid > 0; 等待进程 ID == pid 的子进程
总结
如果子进程退出时,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息
如果在任意时刻调用wait/waitpid方法,子进程存在则正常运行,父进程可能会阻塞在这
如果waitpid是等待了不存在的子进程,则会立即出错返回
status状态
status是wait和waitpid的一个参数,我们不能简单的将他看作一个整形,而应该把它当作位图来看,在这里我只研究低 16 位