#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