产生原因:

1.在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie。

2.网络原因有时会引起僵死进程。

解决方法:

1.设置SIGCLD信号为SIG_IGN,系统将不产生僵死进程。

2.用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。

wait的函数原型是:

#include /* 提供类型pid_t的定义 */

#include

pid_t wait(int *status)

进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,

wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:

pid = wait(NULL);

如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

waitpid的函数原型是:

简介

waitpid系统调用在Linux函数库中的原型是:

#include /* 提供类型pid_t的定义 */

#include

pid_t waitpid(pid_t pid,int *status,int options)

从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:

● pid

从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。

pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。

pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。

pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。

pid

● options

options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:

ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

如果我们不想使用它们,也可以把options设为0,如:

ret=waitpid(-1,NULL,0);

如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。

而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了,有兴趣的读者可以自行查阅相关材料。

看到这里,聪明的读者可能已经看出端倪了--wait不就是经过包装的waitpid吗?没错,察看/include/unistd.h文件349-352行就会发现以下程序段:

static inline pid_t wait(int * wait_stat)

{

return waitpid(-1,wait_stat,0);

}

返回值和错误

waitpid的返回值比wait稍微复杂一些,一共有3种情况:

● 当正常返回的时候,waitpid返回收集到的子进程的进程ID;

● 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

● 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD

其它:

调用 wait&waitpid 来处理终止的子进程:

pid_t wait(int*statloc);

pid_t waitpid(pid_t pid,int*statloc,intoptions);

两个函数都返回两个值:函数的返回值和终止的子进程ID,而子进程终止的状态则是通过statloc指针返回的。

wait&waitpid 的区别是显而易见的,wait等待第一个终止的子进程,而waitpid则可以指定等待特定的子进程。这样的区别可能会在下面这种情况时表现得更加明显:

当同时有5个客户连上服务器,也就是说有五个子进程分别对应了5个客户,此时,五个客户几乎在同时请求终止,这样一来,几乎同时,五个FIN发向服务器,

同样的,五个SIGCHLD信号到达服务器,然而,UNIX的信号往往是不会排队的,显然这样一来,信号处理函数将只会执行一次,残留剩余四个子进程作为

僵尸进程驻留在内核空间。此时,正确的解决办法是利用waitpid(-1, &stat,

WNOHANG)防止留下僵尸进程。其中的pid为-1表明等待第一个终止的子进程,而WNOHANG选择项通知内核在没有已终止进程项时不要阻塞。

wait&waitpid 区别

waitpid提供了wait函数不能实现的3个功能:waitpid等待特定的子进程, 而wait则返回任一终止状态的子进程;

waitpid提供了一个wait的非阻塞版本;

waitpid支持作业控制(以WUNTRACED选项).用于检查wait和waitpid两个函数返回终止状态的宏:

这两个函数返回的子进程状态都保存在statloc指针中, 用以下3个宏可以检查该状态:WIFEXITED(status): 若为正常终止, 则为真. 此时可执行WEXITSTATUS(status): 取子进程传送给exit或_exit参数的低8位.WIFSIGNALED(status): 若为异常终止, 则为真. 此时可执行WTERMSIG(status):   取使子进程终止的信号编号.WIFSTOPPED(status): 若为当前暂停子进程, 则为真. 此时可执行

WSTOPSIG(status): 取使子进程暂停的信号编号

posted on 2007-08-01 00:24 旅途 阅读(1101) 评论(0)  编辑 收藏 引用 所属分类: Linux开发

C语言僵尸进程,僵尸进程的产生和避免相关推荐

  1. linux进程--僵尸进程(五)

    1.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当 ...

  2. linux ksh怎么查找僵尸进程,Unix 进程管理

    进程管理 如果用户在 UNIX 操作系统上执行了一个程序,那么操作系统会为这个程序创建一个运行它的特定环境.这个环境包含系统运行该程序所需的一切资源,使得好像系统中没有运行其他程序一样. 用户如果在 ...

  3. 浅析三种特殊进程:孤儿进程,僵尸进程和守护进程

    其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给 ...

  4. day34 并行并发、进程开启、僵尸及孤儿进程

    day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...

  5. Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)

    进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...

  6. 浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

    其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给 ...

  7. 僵尸进程孤儿进程与守护进程

    其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给 ...

  8. linux下僵尸进程(Defunct进程)的产生与避免

    在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play&q ...

  9. python僵尸进程和孤儿进程_进程3.0——进程状态与僵尸进程、孤儿进程

    进程3.0--进程状态与僵尸进程.孤儿进程 进程状态 一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程.进程状态即体现一个进程的生命状态 一般来说,进程有五种状态:创建状态:进程在创建时需 ...

  10. python 僵尸进程孤儿进程

    僵尸进程&孤儿进程 On Unix and Unix-like computer operating systems, a zombie process or defunct process ...

最新文章

  1. 如何计算字符串中出现的字符串?
  2. leetcode - 375. 猜数字大小 II
  3. android用户界面之AlarmManager教程实例汇
  4. python做逻辑回归r2_利用python实现逻辑回归
  5. sql over 用法
  6. 【喵迹 Pro】GPS轨迹记录安卓APP使用说明
  7. Halcon教程九:把Halcon程序放到C#程序里
  8. 基于机器学习的DGA域名检测
  9. Qt中qmake的INSTALLS变量将编译文件拷到运行目录
  10. 如何将图片转成png格式?图片的格式怎么转换
  11. no jdk specified
  12. maven安装以及本地创库设置
  13. 稀疏矩阵的十字链表存储表示和实现(第五章 P104 算法5.4)
  14. 冲刺阶段第八天,4月26,27,28日。
  15. 关于已上架APP下架的正确方式
  16. Linux系统安装IonCube的方法详解教程
  17. python字符串正向递增_Python字符串基础知识
  18. 三维电子沙盘 智慧警务 一标三实方案书
  19. 微信旅游景区景点评论小程序系统设计与实现
  20. 洛谷刷题:火星人、奖学金、纪念品分组、统计数字、字符串的展开

热门文章

  1. AutoCAD LT 2022下载及教程
  2. 微信小程序 实现导航守卫
  3. js获取当前日期的前七天
  4. 关于破解server2003和普通PC机开机密码的方法心得
  5. 工控机AllInOne——篇4,pve安装爱快
  6. Oracle V$、GV$、X$、V_$、GV_$ 之间的区别
  7. DataGrip到期白剽笔记
  8. Linux普通用户切换为超级用户(精华)
  9. Python中空格的转义字符
  10. nginx部署的时候出现403错误