Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1241988
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-07-17 08:48:18

信号的处理时机--内核态的进程(线程)能kill掉进程吗?

信号在如下时机进行处理:
当从中断或异常(包括系统调用)返回用户态时。
注意:这里是返回“用户态”,也就是说,当当前进程正在内核态执行时,是不能处理信号的,必须等到其返回用户态时才能处理信号。

相关代码如下:
entry_32.S(汇编)

点击(此处)折叠或打开

  1. ret_from_exception:
  2.     /*
  3.      * 这里为什么要关中断?而从中断返回不需要? 因为异常走的是陷阱门,
  4.      * 默认是不关中断执行的,而中断走的是中断门,默认是关中断执行的?
  5.      *
  6.      */
  7.     preempt_stop(CLBR_ANY)
  8. ret_from_intr:
  9. ...
  10.     // 判断是否返回用户态或者v8086模式,如果不是,则转入resume_kernel
  11.     cmpl $USER_RPL, %eax
  12.     jb resume_kernel # not returning to v8086 or userspace

  13.     // 如果是返回用户态
  14. ENTRY(resume_userspace)
  15.     LOCKDEP_SYS_EXIT
  16. ...
  17.     andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
  18.                     # int/exception return?
  19.     // 进行信号及其它处理
  20.     jne work_pending
  21.     jmp restore_all
  22. END(ret_from_exception)

  23. ---
  24. work_pending:
  25.     # 返回用户态时,只需要判断need_resched是否置位,不需要判断preempt_count
  26.     # 如果need_resched置位,则发生调度,否则跳转到work_notifysig
  27.     testb $_TIF_NEED_RESCHED, %cl
  28.     jz work_notifysig
  29. ...
  30. work_notifysig: # deal with pending signals and
  31.                     # notify-resume requests
  32. #ifdef CONFIG_VM86
  33.     testl $X86_EFLAGS_VM, PT_EFLAGS(%esp)
  34.     movl %esp, %eax
  35.     jne work_notifysig_v86 # returning to kernel-space or
  36.                     # vm86-space
  37. 1:
  38. #else
  39.     movl %esp, %eax
  40. #endif
  41.     TRACE_IRQS_ON
  42.     ENABLE_INTERRUPTS(CLBR_NONE)
  43.     movb PT_CS(%esp), %bl
  44.     andb $SEGMENT_RPL_MASK, %bl
  45.     cmpb $USER_RPL, %bl
  46.     jb resume_kernel
  47.     xorl %edx, %edx
  48.     // 调用C函数,其中进行通知链及信号的处理
  49.     call do_notify_resume
  50.     jmp resume_userspace
signal.c

点击(此处)折叠或打开

  1. do_notify_resume()
  2.     do_signal()
所以,从这个角度看,处于内核态执行的进程(或线程)是kill不掉了。
类似道理,内核线程也是kill不掉的,至少从用户态是kill不掉的,在kill给内核线程发送信号时,会对pid进行判断,如果目标pid是内核线程,会直接丢弃信号。
阅读(3883) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~