Linux---僵尸进程的解决办法
僵尸进程
子进程退出后,资源没有释放,处于僵死状态。
产生原因: 子进程优先于父进程退出,父进程正在执行其他操作,没有关注子进程退出,这时候操作系统为了保护子进程退出的原因,不会释放子进程中的资源,子进程既没有运行,也没有退出,处于僵死状态,成为僵尸进程。
通常情况下解决僵尸进程的办法就是:
waitpid(pid_t pid,int * status,int options);
pid:子进程的操作句柄
- pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
- pid=-1 等待任何子进程,相当于 wait()。
- pid=0 等待进程组识别码与目前进程相同的任何子进程。
- pid>0 等待任何子进程识别码为 pid 的子进程。
status:保存子进程退出原因。
- 如果不需要进程退出原因,则设置为NULL
options:存储waitpid函数的等待方式。
- 为0默认阻塞等待。
- WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。
- WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应与一个暂停子进程。
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况: - WIFEXITED(status)如果若为正常结束子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传给exit或_eixt的低8位。
- WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用
WIFEXITED 来判断是否正常结束才能使用此宏。 - WIFSIGNALED(status)若为异常结束子进程返回的状态,则为真;对于这种情况可执行WTERMSIG(status),取使子进程结束的信号编号。
返回值:成功返回子进程的pid,失败返回0。
//使用waitpid等待子进程退出
int main()
{ signal(SIGCHLD,sigcb);pid_t pid = fork();if(pid == 0){sleep(5);//子进程睡眠5秒钟后退出exit(0);}wait(-1,NULL,0);while(1){printf("this is parents\n");}return 0;
}
如果waitpid为阻塞等待,则父进程一直在等子进程退出,直到子进程退出后才执行自己的操作,有没有一种父进程在执行自己的操作,当子进程退出信号发出时,父进程再来释放子进程。
如果这样我们需要先知道子进程退出时,操作系统给父进程发送什么样的信号,来通知父进程。
17号信号:SIGCHLD
但是这个SIGCHLD为进程默认忽略处理信号,这下我们知道为什么父进程不会注意子进程退出。
现在我们知道子进程退出时,操作系统会给父进程发送17号信号,但是我们如何自定义处理该信号呢?
signal
自定义信号处理函数。
//我们通过信号处理函数来通知父进程
void sigcb(int signo)
{wait(-1,NULL,0);
}int main()
{ signal(SIGCHLD,sigcb);pid_t pid = fork();if(pid == 0){sleep(5);//子进程睡眠5秒钟后退出exit(0);}while(1){printf("this is parents\n");}}
但是这样做会产生一个问题:如果父进程有多个子进程呢,由于SIGCHLD信号为非可靠信号,在信号的集合中只保存一份,所以在调用signal函数时,会出现想要释放多个子进程,但事实上只释放一个,导致子进程没有完全处理,同样会产生僵尸进程。
解决办法:循环调用waitpid函数,防止出现进程没有完全处理的情况。
void sigcb(int signo)
{while(wait(-1,NULL,0)>0);//如果有子进程退出,则循环处理
}int main()
{ signal(SIGCHLD,sigcb);pid_t pid = fork();if(pid == 0){sleep(5);//子进程睡眠5秒钟后退出exit(0);}while(1){printf("this is parents\n");}}
Linux---僵尸进程的解决办法相关推荐
- Linux的僵尸进程及其解决方法(转)
Linux的僵尸进程及其解决方法 摘要: Linux的僵尸进程及其解决方法 1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将 ...
- 转:Linux 僵尸进程详解
Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...
- 关于linux 僵尸进程
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程 怎样产生僵尸进程的: 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而 ...
- linux僵尸进程理解,Linux僵尸进程详细解析
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为 ...
- linux 僵尸进程 defunct
在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的"僵尸"进程. "僵尸"进程是一个早已 死亡的进 ...
- 远程连接Linux服务器无法连接解决办法
1.查看SSH是否安装(检查是否装了SSH包) 输入命令:rpm -qa | grep ssh 如下如所示系统已经默认安装了SSH: 远程连接Linux服务器无法连接解决办法 若没有安装,则输入 yu ...
- windows文件上传到linux平台乱码的解决办法
windows文件上传到linux平台乱码的解决办法 1.首先在windows上,使用ConvertZ工具,把文件名称(不是文件内容)转码,例如GBK换成Unicode 简体 2.然后上传到linux ...
- RedFlag Linux忘记root密码解决办法
转于lee的http://hi.baidu.com/maozilee/item/12a62a76f371df2bd7a89c5d RedFlag Linux忘记root密码解决办法 Linux忘记ro ...
- linux defunct 进程,Linux僵尸进程(Zombie or defunct)
僵尸进程(Zombie or defunct)关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.cit.cn 僵尸进程就是 ...
最新文章
- HL7 Figure 2-1. Delimiter values(分隔符值)
- Ajax提交后Moedl And View不进行页面跳转的解决方案
- [小程序]小程序框架的简单页面布局
- 银行产生的烂账是如何处理的?
- ER TO SQL语句
- Spring的@Scheduled 动态更新cron表达式
- android基础知识学习(1) TextView属性大全+单行显示长文本
- cp命令显示进度条_教程 | Linux常用命令大全
- Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
- java虚拟机内存溢出的三个原因_java虚拟机学习(三) 内存溢出异常
- iphone多线程事件循环
- 【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】
- 格拉布斯法—异常值判断(异常值)
- (Python+MatLab) 分别实现 PSNR 和 SSIM
- 参考文献编号[9]之后出现空格解决方法
- 条件覆盖,路径覆盖,语句覆盖
- Unix环境高级编程(第三版)apue.h头文件安装教程(第三版)
- Win11键盘无法输入任何东西怎么解决?
- 一篇关于编程的文章,启发你的编程知识
- C++ini文件操作