如何防止僵尸进程的产生

#include<stdio.h>

#include<sys/types.h>

#include<sys/wait.h>

#include<unistd.h>

#include<signal.h>

static pid_t so_pid;

static void chld_wait( int signo )

{

waitpid( so_pid, NULL, 0 );

fprintf(stderr, "父进程[%d]已成功捕捉子进程[%d]退出信号\n", getpid(), so_pid);

return;

}

int main( void )

{

int signo;

if( (so_pid=fork()) < 0 )

{

fprintf(stderr, "main fork err!\n");

return 0;

}

else if( so_pid > 0 )

{

signal( SIGCHLD, chld_wait );

fprintf( stderr, "父进程[%d]\n", getpid() );

while( 1 )

{

}

exit( 0 );

}

sleep(2);

fprintf( stderr, "子进程退出[%d]\n", getpid() );

exit(0);

}

运行结果:

父进程[4972]

子进程退出[4973]

父进程[4972]已成功捕捉子进程[4973]退出信号

查看有无僵尸进程:

ps  -ef |grep defunct

无僵尸进程

若将signal( SIGCHLD, chld_wait );此行注释掉,

则运行结果:

父进程[4972]

子进程退出[4973]

查看有无僵尸进程:

ps  -ef |grep defunct

有僵尸进程产生

如何防止僵尸进程的产生

时间: 2024-10-14 20:47:16

如何防止僵尸进程的产生的相关文章

第十九篇:处理僵尸进程的两种经典方法

前言 如果父进程没有结束,而子进程终止了.那么在父进程调用 wait 函数回收这个子进程或者父进程终止以前,这个子进程将一直是僵尸进程. 本文将提供两种方法处理这个问题. 方法一:父进程回收法 wait函数将使其调用者阻塞,直到其某个子进程终止.故父进程可调用wait函数回收其僵尸子进程.除此之外,waitpid函数提供更为详尽的功能( 增加了非阻塞功能以及指定等待功能 ),请读者自行查阅相关资料. 代码实现 1 #include <unistd.h> 2 #include <sys/w

Linux中的僵尸进程和孤儿进程

在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程.        操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)

一、进程与信号之僵尸进程

孤儿进程:父进程被终结,子进程成为孤儿进程,被init进程接管 僵尸进程:子进程被终结,内存未被释放,形成僵尸进程 #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(void) { pid_t pid; pid=fork(); if(pid<0) { printf("fork error"); exit(1); } else if(pid ==0) { //终

服务器产生大量僵尸进程,查询并杀死zombie

一.服务器发生异常报警描述:服务器负载过高,达到160左右,网站访问正常 二.分析产生原因:php统计时,计划任务中的任务产生的大量僵尸进程 三.过程查看:     如何查看僵尸进程:     ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 四.解决方案: 如何杀死僵尸进程:(通过临时写下面脚本,杀死其父进程) #!/bin/bash for ZOMBIE in `ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' |

孤儿进程 &amp;&amp; 僵尸进程

background: unix: 每个子进程退出,内核释放该进程所有资源,打开的文件,占用的内存 保留的信息:the process ID,the termination status of the process,the amount of CPU time taken by the process 父进程用wait()/waitpid()释放子进程的保留信息 父进程不调用wait()/waitpid()进程号一直被占用,系统所能提供的进程号有限,没有可用的进程号导致系统不能产生新的进程 Z

孤儿进程和僵尸进程

孤儿进程和僵尸进程 一.定义:什么是孤儿进程和僵尸进程 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出.这个子进程就是僵尸进程. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程将会导致资源浪费,而孤儿则不会. 子进程持续10秒钟的僵尸状态(EXIT_ZOMBIE)------------------------------

孤儿进程与僵尸进程[总结]

http://www.cnblogs.com/Anker/p/3271773.htm 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧.晚上回来google了一下,再次参考APUE,认真总结一下,加深理解. 2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程

linux 如何清理僵尸进程

今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf 4765 ?        Z      0:00      \_ [nova-novncproxy] <defunct> 4766 ?        Z      0:00      \_ [nova-no

如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

用ps和grep命令寻找僵尸进程 #ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数 因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程 运行结果参考如下 Z 12334 12339 /path/cmd 这时,我们可以使用 kill -HUP 12339来杀

僵尸进程

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进