孤儿进程
1. // 父进程死了,子进程还活着,子进程叫孤儿进程
2. // 孤儿被干爹init进程领养,init进程变成了孤儿进程的父进程
3. // 为什么需要父进程?因为释放子进程占用的资源需要父进程
-. 进程结束之后,能够释放用户区空间
-. 释放不了pcb(在内核空间),必须由父进程释放,故需要init进程成为孤儿进程的父进程
僵尸进程
1. // 进程死了,父进程还活着,父进程不去释放子进程的pcb,孩子就变成了僵尸进程
2. // 僵尸进程是一个已经死掉的进程
wait函数
pid_t wait(int *status);
waitpid函数
pid_t waitpid(pid_t pid, int *status, int options);
1. // 参数
1. // 参数pid
- pid==-1:等待任一子进程,与wait等效
- pid==0:等待其组ID等于调用进程的组ID的任一子进程
- pid>0:等待进程ID为pid的子进程
- pid<-1:等待其组ID等于的pid的绝对值的任一子进程
2. // 参数options
- 设置为WNOHANG,函数非阻塞;
- 设置为0,函数阻塞
2. // 返回值
- >0:返回清理掉的进程ID
- -1:无子进程
- 0:参数3为WNOHANG,且子进程正在运行