- 孤儿进程
1. 父进程创建子进程后,父进程先结束,子进程任然存在 -- 子进程称为孤儿进程
2. 孤儿进程会被系统init进程(不同系统的名称不同)领养,init进程变为孤儿进程的父进程
3. 领养操作是为了释放子进程占用的系统资源
a. 进程结束后,能够自行释放用户区空间
b. 进程释放不了pcb,必须由父进程释放,因此有init来释放
- 僵尸进程
1. 父进程创建子进程后,子进程结束
2. 父进程没有结束,因此,不会去释放子进程的pcb内存区
3. 子进程称为僵尸进程,是一个结束的进程
4. 使用ps aux命令可以查看到,在进程中,僵尸进程具有<defunct>标识
- 进程回收:wait函数 – 阻塞函数
1. 函数原型:
pid_t wait(int *wstatus);
2. 参数
wstatus:判定子进程是如何结束的
定义一个int类型变量,然后传入变量地址,函数执行后,会将结果赋值给变量
3. 返回值
-1:回收失败,没有子进程可以回收了
>0:回收的子进程的pid
4. 例如:
{
int status;
pid_t wpid = wait(&status);
if (WIFEXITED(status))
xxx;
else if (WIFSIGNALED(status))
xxx;
}
a. WIFEXITED(status):如果为非0,则表示进程正常结束。
且WEXITSTATUS(status)为进程退出状态(exit(x);/return x;)的x值
b. WIFSIGNALED(status):如果为非0,则表示进程异常终止(例如kill的信号终止)
且WTERMSIG(status)为令进程异常终止的信号的编号
- 进程回收:waitpid函数 – 可设置阻塞或非阻塞,有选择的回收指定pid进程
1. 函数原型:
pid_t waitpid(pid_t pid, int *wstatus, int options);
2. 参数:
pid:
a. pid == -1 表示等待任一子进程。与wait函数等效
b. pid > 0 表示等待与pid相等进程ID的进程
c. pid == 0 表示回收当前进程组的所有子进程,等待组ID与进程组ID相等的任一子进程
d. pid < -1 表示等待组ID与pid的绝对值相等的任一子进程
当需要回收所有子进程时,可以将pid设置为-1,放入while循环中,因为调用一次只回收一个
wstatus:
子进程的退出状态,与wait一致
options:
阻塞与非阻塞参数:WNOHANG -- 非阻塞
0 -- 阻塞
3. 返回值:
>0:返回回收的子进程ID
-1:无子进程可以回收
0:当设置为非阻塞时,0表示子进程正在运行
- while循环调用waitpid
pid_t wpid;
while( (wpid = waitpid(-1, NULL, WNOHANG)) != -1)
{
if(wpid == 0) //表示进程还在执行
continue;
printf("child die, pid = %d\n",wpid);
}