僵尸进程

子进程退出后,资源没有释放,处于僵死状态。

产生原因: 子进程优先于父进程退出,父进程正在执行其他操作,没有关注子进程退出,这时候操作系统为了保护子进程退出的原因,不会释放子进程中的资源,子进程既没有运行,也没有退出,处于僵死状态,成为僵尸进程。

通常情况下解决僵尸进程的办法就是:
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---僵尸进程的解决办法相关推荐

  1. Linux的僵尸进程及其解决方法(转)

    Linux的僵尸进程及其解决方法 摘要: Linux的僵尸进程及其解决方法 1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将 ...

  2. 转:Linux 僵尸进程详解

    Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...

  3. 关于linux 僵尸进程

    僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程 怎样产生僵尸进程的: 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而 ...

  4. linux僵尸进程理解,Linux僵尸进程详细解析

    在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为 ...

  5. linux 僵尸进程 defunct

    在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的"僵尸"进程. "僵尸"进程是一个早已 死亡的进 ...

  6. 远程连接Linux服务器无法连接解决办法

    1.查看SSH是否安装(检查是否装了SSH包) 输入命令:rpm -qa | grep ssh 如下如所示系统已经默认安装了SSH: 远程连接Linux服务器无法连接解决办法 若没有安装,则输入 yu ...

  7. windows文件上传到linux平台乱码的解决办法

    windows文件上传到linux平台乱码的解决办法 1.首先在windows上,使用ConvertZ工具,把文件名称(不是文件内容)转码,例如GBK换成Unicode 简体 2.然后上传到linux ...

  8. RedFlag Linux忘记root密码解决办法

    转于lee的http://hi.baidu.com/maozilee/item/12a62a76f371df2bd7a89c5d RedFlag Linux忘记root密码解决办法 Linux忘记ro ...

  9. linux defunct 进程,Linux僵尸进程(Zombie or defunct)

    僵尸进程(Zombie or defunct)关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.cit.cn 僵尸进程就是 ...

最新文章

  1. HL7 Figure 2-1. Delimiter values(分隔符值)
  2. Ajax提交后Moedl And View不进行页面跳转的解决方案
  3. [小程序]小程序框架的简单页面布局
  4. 银行产生的烂账是如何处理的?
  5. ER TO SQL语句
  6. Spring的@Scheduled 动态更新cron表达式
  7. android基础知识学习(1) TextView属性大全+单行显示长文本
  8. cp命令显示进度条_教程 | Linux常用命令大全
  9. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
  10. java虚拟机内存溢出的三个原因_java虚拟机学习(三) 内存溢出异常
  11. iphone多线程事件循环
  12. 【优化充电】基于matlab多种遗传算法求解电动汽车有序充电优化问题【含Matlab源码 792期】
  13. 格拉布斯法—异常值判断(异常值)
  14. (Python+MatLab) 分别实现 PSNR 和 SSIM
  15. 参考文献编号[9]之后出现空格解决方法
  16. 条件覆盖,路径覆盖,语句覆盖
  17. Unix环境高级编程(第三版)apue.h头文件安装教程(第三版)
  18. Win11键盘无法输入任何东西怎么解决?
  19. 一篇关于编程的文章,启发你的编程知识
  20. C++ini文件操作

热门文章

  1. Spring MVC开启注解
  2. EXSi5.5安装篇
  3. Block 在不同情况下的变量存储区域
  4. 2013再见,2014你好!
  5. Cocos2dx游戏开发系列笔记3:牛刀小试-忍者飞镖射幽灵的Demo
  6. OSGI开发web应用
  7. centos php自动提示,CentOS环境实现Git命令自动补全
  8. Redis-与SpringBoot的集成
  9. linux重定向权限不够,linux – 如何使用sudo将输出重定向到一个我没有权限写入的位置?...
  10. python字符串操作_python字符串操作