中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
unix下的僵尸进程......
作者:未知 时间:2005-09-13 19:17 出处:ChinaUnix.net 责编:chinaitpower
              摘要:unix下的僵尸进程......

我用netterm登陆到unix环境下,运行一个C程序,在运行期间netterm的通讯被断掉,结果出现了很多僵尸进程。说明:我运行的C程序的进程名为AAA,是单进程程序。此程序在运行过程中会systerm另一个程序BBB,而BBB是一个多进程的程序(会fork子进程)。
请问各位大虾,为什么会出现僵尸进程呢?程序中如何处理? 

 mygod 回复于:2002-08-22 13:29:03
这个问题已经在这个论坛讨论过多次,原因是父进程没有处理子进程结束的信号就结束了,具体的可以参考fanqiang.com上的相关文档或在本论坛查找

 betydu 回复于:2002-08-22 15:03:29
to mygod:
   其实我在本论坛查找过,但一直没找到相关内容。能不能请你转贴一些信息,谢了。

 mygod 回复于:2002-08-22 15:13:27
http://oldhand.org/article/200204/20020400000302_1.xml

 yyl66 回复于:2002-08-23 12:53:30
为什么斑主回答问题这么草率!
以下可以防止僵尸进程的出现!
void add_fork(int signo)
{

pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
printf("退出进程号为:%d 系统新增进程序。\n",pid);

return;
}
main()
{
signal(SIGCHLD,add_fork);
 if (fork()==0)
{
printf("%d process run....",getpid());
do_your_thing();
}
}




 mygod 回复于:2002-08-23 12:54:16
你看好了,我现在不是斑竹了!!!

 yyl66 回复于:2002-08-23 12:58:48
对不起,我不知道啊!

 yuejw 回复于:2002-08-30 11:10:37
不想查看子进程退出码的话直接signal(SIGCLD, SIG_IGN)就可以了。

 qtjqtjqtj 回复于:2002-08-30 16:19:08
fork()两次可 避免僵尸进程

 离了水的蛤蟆 回复于:2002-08-31 12:14:47
我觉得qtjqtjqtj的注意不怎么样,还是按yuejw和yyl66的做吧。

 iloveunix 回复于:2002-09-02 11:27:36
fork()两次,就可以避免僵尸进程!

 betydu 回复于:2002-09-03 10:56:15
版主:能否介绍一下SIGCLD和SIGCHLD这两个信号的区别啊?

 yuejw 回复于:2002-09-03 14:25:19
一样的。

 hjqq 回复于:2002-11-03 22:02:09
很想知道SIGCLD和SIGCHLD这两个信号的区别,希望告知。谢谢!

 beggar 回复于:2002-11-03 23:08:28
看为什么Wait返回-1贴

 ilike911 回复于:2002-11-05 14:36:34
#define SIGCHLD SIGCLD

就是这样

signal(SIGCHLD, SIG_IGN) 显然是最简单的回收进程的方法

 fatmonk 回复于:2002-11-05 14:47:42
SIGCHLD是POSIX标准中定义的,SIGCLD是SysV的事实标准,两个信号想表达的意思一样,只是出处不同,而今大多数UNIX都把两个信号define成同一个值。推荐用SIGCHLD。

 beggar 回复于:2002-11-06 19:03:01
SystemV和svr4处理SIGCLD的方式与SIGCHLD不同.BSD两者相同

 西北风 回复于:2002-11-26 20:14:19
在比较繁忙的应用中使用WAIT也无法解决僵尸进程。以前有经历在涉及数据库的程序中,当数据库异常时会出现不正常的僵尸进程,而程序中实际上已经使用了wait命令,并且捕捉了SIGCLD信号。系统很忙时估计SIGCLD信号传递不正常。

 htldm 回复于:2002-12-21 12:21:38
[quote][b]下面引用由[u]离了水的蛤蟆[/u]在 [i]2002/08/31 12:14pm[/i] 发表的内容:[/b]
我觉得qtjqtjqtj的注意不怎么样,还是按yuejw和yyl66的做吧。
[/quote]
qtjqtjqtj说得对啊! fork 两次,把它交给init进程,有系统接管,有多放心!

 罗格纳 回复于:2003-12-05 17:14:01
fork两次是为了产生deamon进程,
实际上只要父进程退出,子进程就已经转交给init了!

 hrg7389 回复于:2004-02-23 09:05:41
[quote:30bdb48916][b:30bdb48916]下面引用由[u:30bdb48916]离了水的蛤蟆[/u:30bdb48916]在 [i:30bdb48916]2002/08/31 12:14pm[/i:30bdb48916] 发表的内容:[/b:30bdb48916]
我觉得qtjqtjqtj的注意不怎么样,还是按yuejw和yyl66的做吧。
[/quote:30bdb48916]
qtjqtjqtj说得对啊! fork 两次。我就一直使用这种方式,效果很好。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有