- 论坛徽章:
- 11
|
本帖最后由 zylthinking 于 2011-12-07 15:27 编辑
確定。你是怎麼想的?
Mr_Yao 发表于 2011-12-07 14:50 ![]()
所谓僵尸进程, 其实就是 SIGCHILD 没有被父进程处理的进程, SIGCHILD 被处理只有在中断, 异常, 及系统调用返回时;
首先异常不可能发生; 因为异常发生在用户空间; 除非是页面错误;
中断可不太可能, 因为 sleep 时已经是不在运行列表中了, 中断借助的是当前进程, 因此就算处理SIGCHILD也不会是 sleep 中的进程的SIGCHILD
剩下的系统调用就奇怪了, 因为这里正好命中, 那么在 sleep 返回后, 应该已经处理了 sigchild 的。- 205ENTRY(ret_from_sys_call)
- 206#ifdef CONFIG_SMP
- 207 movl processor(%ebx),%eax
- 208 shll $CONFIG_X86_L1_CACHE_SHIFT,%eax
- 209 movl SYMBOL_NAME(irq_stat)(,%eax),%ecx # softirq_active
- 210 testl SYMBOL_NAME(irq_stat)+4(,%eax),%ecx # softirq_mask
- 211#else
- 212 movl SYMBOL_NAME(irq_stat),%ecx # softirq_active
- 213 testl SYMBOL_NAME(irq_stat)+4,%ecx # softirq_mask
- 214#endif
- 215 jne handle_softirq
- 216
- 217ret_with_reschedule:
- 218 cmpl $0,need_resched(%ebx)
- 219 jne reschedule
- 220 cmpl $0,sigpending(%ebx) ----------------这里
- 221 jne signal_return
- 222restore_all:
- 223 RESTORE_ALL
- 224
- 225 ALIGN
- 226signal_return:
- 227 sti # we can get here from an interrupt handler
- 228 testl $(VM_MASK),EFLAGS(%esp)
- 229 movl %esp,%eax
- 230 jne v86_signal_return
- 231 xorl %edx,%edx
- 232 call SYMBOL_NAME(do_signal) --------------这里
- 233 jmp restore_all
- 234
- 235 ALIGN
复制代码- 536
-
- 584int do_signal(struct pt_regs *regs, sigset_t *oldset)
- 585{
- 586 siginfo_t info;
- 587 struct k_sigaction *ka;
- .......................................
- 643 ka = ¤t->sig->action[signr-1];
- 644 if (ka->sa.sa_handler == SIG_IGN) {
- 645 if (signr != SIGCHLD)
- 646 continue;
- 647 /* Check for SIGCHLD: it's special. */
- 648 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0) ------------------这里
- 649 /* nothing */;
- 650 continue;
- 651 }
- 652
- ...........................................
- 715 return 0;
- 716}
- 717
复制代码 那为什么在其后的 ps 中, 会照样找到一个 zombie 的子进程呢 |
|