进程之资源回收:
(1)在进程结束后只是把占用的内存释放掉而已,但是一些系统资源依旧被占用着
(2)我们需要把系统所分配给进程的资源进行回收,否则进程在运行结束后会变成僵尸状态等待系统在一定的时候再去回收进程的资源;
(3)我们可以为了避免死掉的进程一直占用着系统资源,我们可以在进程执行结束前把它所占有的系统资源给回收
进程回收资源相关函数:
//头文件
#include <sys/wait.h>
#include <sys/types.h>
//函数原型
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
//函数介绍
/****************************************************
函数作用:用于回收进程运行结束后的系统资源
函数形参:
status:用于保存进程退出时的状态,一般不在乎进出退出状态NULL
(获取到的退出状态不仅仅为进程退出状态值,还包括了是否为正常退出或者其他原因退出等信息,进程退出状态值保存在8-16位)
pid : 输入参数有
-1,等待任意一个子进程
>0,ID号为pid,指定需要等待回收的子进程id号
options:
0:阻塞等待(此时与wait相似)
WNOHANG :不阻塞等待进程的退出,若此时没有已退出进程则直接返回
WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会. 子进程的结束状态返回后存于status, 底下有几个宏可判别结束情况
WIFEXITED(status):如果子进程正常结束则为非0 值.
WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏.
WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status):取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏.
WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况.
WSTOPSIG(status):取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏.
函数返回值:
成功:
wait:被回收子进程ID号
waitpid:
0:当option使用WNOHANG,表示没有已退出的子进程
>0:被回收资源的进程号
失败: -1
***************************************************/
测试代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, const char **argv)
{
//创建一个子进程
pid_t id = fork();
if(id == -1)
{
perror("fork failed!");
return -1;
}
else if(id == 0) //子进程里面的返回值是等于0
{
printf("I AM a child!\n");
printf("child:%d\n", getpid()); //获取自己ID号
exit(230);
}
else if(id > 0) //父进程返回值大于0的
{
sleep(2);
printf("I AM a parent!\n");
//回收子进程资源--》不阻塞等待
int status;
//wait(&status);//使用wait函数回收进程资源,会阻塞等待进程退出
int ret = waitpid(-1, &status, WNOHANG);
if(ret == -1) //执行失败
{
perror("wait pid failed!\n");
}
else if(ret == 0)
{
printf("此时没有已退出的子进程!\n");
}
else //回收子进程资源成功,打印被回收子进程ID号
{
printf("被回收资源的子进程ID号ret:%d\n", ret);
printf("status:%d\n", (0xff00 & status) >> 8); //打印退出值
printf("status:%#x\n", status);//打印存放状态的十六进制数,看状态值是否存放在8-16位
printf("status:%d\n", WEXITSTATUS( status)); //打印退出值
}
}
return 0;
}
运行结果:
总结:
(1):wait函数会等待系统中的某一个进程退出然后回收它的资源,但是如果我们想指定回收某一进程的资源,只能使用waitpid函数
(2)建议一般情况下能用waitpid则用waitpid;因为使用wait函数的话,若此时系统有其他进程退出,则wait函数就会直接返回,而waitpid可以指定等待某一进程的退出