1、apue书上已经有了实例,调用fork两次,一个子进程退出,则第二个子进程有init进程领养,退出的时候就不会变成僵尸进程。
2、如果父进程在fork之前设置了SIGCLD信号的动作为SIG_IGN,则有该父进程创建的子进程在退出时不会变成僵尸进程。事例如下:
-
#include <unistd.h>
-
#include <stdio.h>
-
#include <string.h>
-
#include <signal.h>
-
int
-
main()
-
{
-
pid_t pid1 = 0;
-
pid_t pid2 = 0;
-
int i = 0;
-
if(signal(SIGCLD, SIG_IGN) != SIG_ERR)
-
{
-
printf("set signal sucessfully\n");
-
}
-
pid1 = fork();
-
if(pid1 < 0)
-
{
-
printf("fork error\n");
-
return -1;
-
}
-
if(pid1 == 0)
-
{
-
printf(" i am child\n");
-
return 0;
-
}
-
else
-
-
{
-
printf(" parent\n");
-
while( i < 10)
-
{
-
i++;
-
sleep(3);
-
}
-
return -1;
-
-
}
-
- }
利用ps-aux查看,没有状态为z的僵尸进程。