学习笔记
面试经常问到什么是僵尸进程,孤儿进程, 守护进程
守护进程后面再讲。
父进程回收子进程PCB,如何回收子进程资源?
通过wait 函数和 waitpid 函数来处理
wait 函数
每一进程结束之后,都会在内核残留PCB。
PCB 残留的目的是为了方便获取它的终止状态。
父进程调用wait 函数可以回收子进程终止信息,该函数有三个功能:
1.阻塞等待子进程退出
表示调用函数之后,一直等待子进程退出,而且是死等。
2.回收子进程残留资源
3.获取子进程结束状态(退出原因)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
第一参数: 表示传出参数
返回值: 成功 :返回终止孩子的pid
失败 : -1
$cat wait.c
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(int argc, char **argv)
{
pid_t pid,wpid;
int status;
pid = fork();
if(0 == pid)
{
printf("---child, my parent is %d,going to sleep 10s\n",getppid());
sleep(10);
printf("-------child die!-------\n");
}
else if( pid > 0)
{
wpid = wait(&status);
if(-1 == wpid)
{
perror("wait error!");
exit(1);
}
printf("--------parent wait finish\n");
}
else
{
perror("fork");
exit(1);
}
return 0;
}
$make wait
gcc wait.c -o wait -Wall -g
$./wait
---child, my parent is 3550,going to sleep 10s
-------child die!-------
--------parent wait finish
退出状态可以描述进程死亡信息。
WIFEXITED(status)
返回值为真,正常退出
WEXITSTATUS(status)
返回子进程退出的状态
WIFSIGNALED(status)
如果被信号杀死,则返回为真
WTERMSIG(status)
返回杀死子进程的信号编号
本文介绍了面试中常见的进程概念,包括僵尸进程、孤儿进程和守护进程。重点讲解了父进程如何通过wait函数回收子进程资源,如阻塞等待、资源回收和获取退出状态。示例代码展示了wait函数的使用,以及如何检查退出状态以获取进程死亡信息。
855

被折叠的 条评论
为什么被折叠?



