1. 僵尸进程
摘抄一段
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)他, 那么他将变成一个僵尸进程。
2. 解决方法
1)忽略SIGCHILD信号,这个方式最简单,但有时会给其他程序带来影响
struct sigaction sa;
sa.sa_handler = SIG_IGN;
#ifdef SA_NOCLDWAIT
sa.sa_flags = SA_NOCLDWAIT;
#else
sa.sa_flags = 0;
#endif
sigemptyset (&sa.sa_mask);
sigaction (SIGCHLD, &sa, NULL);
其中sigaction (SIGCHLD, &sa, NULL);换作sigaction (SIGCHLD, &new_sa, &old_sa);可以使用old_sa来保存之前的,之后可以再用sigaction (SIGCHLD, &old_sa, NULL);来恢复。
2)利用孙子进程来处理事务,fork两次
pid_t pid;
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
//孙子进程处理
execlp ("gedit","gedit",NULL, NULL);
}else{
exit(0); //子进程退出
}
}
//父进程继续
3)使用waitpid或者wait来处理
其中waitpid(pid, NULL, WNOHANG);使用参数WNOHANG可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。
僵尸进程
1881

被折叠的 条评论
为什么被折叠?



