免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3898 | 回复: 12
打印 上一主题 下一主题

请教一个关于僵尸进程的问题,谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-07 13:10 |只看该作者 |倒序浏览
Unix/Linux里面讲的僵尸进程是针对父进程的,还是针对子进程的?

论坛徽章:
0
2 [报告]
发表于 2011-12-07 13:21 |只看该作者
代碼A:

  1. #include <unistd.h>   
  2. #include <stdlib.h>   
  3. #include <stdio.h>   
  4. #include <sys/wait.h>   
  5.   
  6. const char cmd_init[]="ps -o pid,ppid,state,tty,command";  
  7.   
  8. int main(int argc,char **argv)  
  9. {  
  10.         pid_t   pid;
  11.         if((pid=fork()) < 0){
  12.                 exit(-1);
  13.         }
  14.         else if(pid==0){  /* 子進程exit */  
  15.                 exit(0);  
  16.         }
  17.         sleep(5);
  18.         system(cmd_init);
  19.         exit(0);  
  20. }
复制代码
子进程先于父进程退出,此时在父进程sleep()这5秒的过程中,子进程就是一个僵尸进程;
上例中,父进程是正常退出,因此子进程也会退出;
如果在上例中,父进程是异常退出,此时子进程会保持zombie状态,并且由进程init托管。
上面这种说法正确么?

如果反過來,父进程先正常退出了,子进程继续执行;待子进程执行完毕之后,子进程会是什么状态?
如果父进程异常退出了,子进程在执行完毕之后,又会是什么状态?

论坛徽章:
0
3 [报告]
发表于 2011-12-07 13:37 |只看该作者
僵尸进程就是没人管的孩子,最后只能有福利院接管

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2011-12-07 14:43 |只看该作者
代碼A:子进程先于父进程退出,此时在父进程sleep()这5秒的过程中,子进程就是一个僵尸进程;
上例中,父进程是 ...
Mr_Yao 发表于 2011-12-07 13:21


sleep 过程中确定时zombie吗, 我没做实验, 但似乎和我看的代码不想符合

论坛徽章:
0
5 [报告]
发表于 2011-12-07 14:50 |只看该作者
sleep 过程中确定时zombie吗, 我没做实验, 但似乎和我看的代码不想符合
zylthinking 发表于 2011-12-07 14:43



    確定。你是怎麼想的?

论坛徽章:
0
6 [报告]
发表于 2011-12-07 14:55 |只看该作者
如果反過來,父进程先正常退出了,子进程继续执行;待子进程执行完毕之后,子进程会是什么状态?
如果父进程异常退出了,子进程在执行完毕之后,又会是什么状态?Mr_Yao 发表于 2011-12-07 13:21


如果是父進程首先退出了,那麼內核會自動查找屬於該進程的“活動”的子進程,并將他們託管給init進程。
這個和父進程是不是正常退出沒有關係的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2011-12-07 15:18 |只看该作者
本帖最后由 zylthinking 于 2011-12-07 15:27 编辑
確定。你是怎麼想的?
Mr_Yao 发表于 2011-12-07 14:50


所谓僵尸进程, 其实就是 SIGCHILD 没有被父进程处理的进程, SIGCHILD 被处理只有在中断, 异常, 及系统调用返回时;
首先异常不可能发生; 因为异常发生在用户空间; 除非是页面错误;
中断可不太可能, 因为 sleep 时已经是不在运行列表中了, 中断借助的是当前进程, 因此就算处理SIGCHILD也不会是 sleep 中的进程的SIGCHILD
剩下的系统调用就奇怪了, 因为这里正好命中, 那么在 sleep 返回后, 应该已经处理了 sigchild 的。
  1. 205ENTRY(ret_from_sys_call)
  2. 206#ifdef CONFIG_SMP
  3. 207        movl processor(%ebx),%eax
  4. 208        shll $CONFIG_X86_L1_CACHE_SHIFT,%eax
  5. 209        movl SYMBOL_NAME(irq_stat)(,%eax),%ecx          # softirq_active
  6. 210        testl SYMBOL_NAME(irq_stat)+4(,%eax),%ecx       # softirq_mask
  7. 211#else
  8. 212        movl SYMBOL_NAME(irq_stat),%ecx         # softirq_active
  9. 213        testl SYMBOL_NAME(irq_stat)+4,%ecx      # softirq_mask
  10. 214#endif
  11. 215        jne   handle_softirq
  12. 216        
  13. 217ret_with_reschedule:
  14. 218        cmpl $0,need_resched(%ebx)
  15. 219        jne reschedule
  16. 220        cmpl $0,sigpending(%ebx)   ----------------这里
  17. 221        jne signal_return
  18. 222restore_all:
  19. 223        RESTORE_ALL
  20. 224
  21. 225        ALIGN
  22. 226signal_return:
  23. 227        sti                             # we can get here from an interrupt handler
  24. 228        testl $(VM_MASK),EFLAGS(%esp)
  25. 229        movl %esp,%eax
  26. 230        jne v86_signal_return
  27. 231        xorl %edx,%edx
  28. 232        call SYMBOL_NAME(do_signal)  --------------这里
  29. 233        jmp restore_all
  30. 234
  31. 235        ALIGN
复制代码
  1. 536

  2. 584int do_signal(struct pt_regs *regs, sigset_t *oldset)
  3. 585{
  4. 586        siginfo_t info;
  5. 587        struct k_sigaction *ka;
  6.   .......................................
  7. 643                ka = &current->sig->action[signr-1];
  8. 644                if (ka->sa.sa_handler == SIG_IGN) {
  9. 645                        if (signr != SIGCHLD)
  10. 646                                continue;
  11. 647                        /* Check for SIGCHLD: it's special.  */
  12. 648                        while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)  ------------------这里
  13. 649                                /* nothing */;
  14. 650                        continue;
  15. 651                }
  16. 652
  17. ...........................................
  18. 715        return 0;
  19. 716}
  20. 717
复制代码
那为什么在其后的  ps 中, 会照样找到一个 zombie 的子进程呢

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
8 [报告]
发表于 2011-12-07 16:42 |只看该作者
如果反過來,父进程先正常退出了,子进程继续执行;待子进程执行完毕之后,子进程会是什么状态?
============

父进程正常退出后,如果子进程还在执行,它就由init领养了。
子进程执行完毕之后,它的资源由init回收。

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
9 [报告]
发表于 2011-12-07 16:44 |只看该作者
僵尸进程是因为,父进程一直存在,产生子进程,当子进程退出时,父进程没有回收他退出子进程的资源。

如果父进程直接就退出了那就不会有僵尸进程了

论坛徽章:
0
10 [报告]
发表于 2011-12-08 09:00 |只看该作者
僵尸进程是因为,父进程一直存在,产生子进程,当子进程退出时,父进程没有回收他退出子进程的资源。

如 ...
pandaiam 发表于 2011-12-07 16:44



    恩,说到了点子上了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP