从上面的分析可以看出,我们看到信号被添加到信号队列之后,会调用signal_wake_up()唤醒这个进程,signal_wake_up()(kernel/signal.c)的定义如下:

/*
 * Tell a process that it has a new active signal..
 *
 * NOTE! we rely on the previous spin_lock to
 * lock interrupts for us! We can only be called with
 * "siglock" held, and the local interrupt must
 * have been disabled when that got acquired!
 *
 * No need to set need_resched since signal event passing
 * goes through ->blocked
 */
void signal_wake_up(struct task_struct *t, int resume)
{
 unsigned int mask;

 set_tsk_thread_flag(t, TIF_SIGPENDING);//为进程设置TIF_SIGPENDING标志

 /*
  * For SIGKILL, we want to wake it up in the stopped/traced case.
  * We don't check t->state here because there is a race with it
  * executing another processor and just now entering stopped state.
  * By using wake_up_state, we ensure the process will wake up and
  * handle its death signal.
  */
 mask = TASK_INTERRUPTIBLE;
 if (resume)
  mask |= TASK_STOPPED | TASK_TRACED;
 if (!wake_up_state(t, mask))
  kick_process(t);
}

  signal_wake_up()首先为进程设置TIF_SIGPENDING标志,说明该进程有延迟的信号要等待处理。然后再调用wake_up_state()唤醒目标进程,如果目标进程在其他的CPU上运行,wake_up_state()将返回0,此时调用kick_process()向该CPU发送一个处理器间中断。当中断返回前戏,会为当前进程处理延迟的信号。

  此后当该进程被调度时,在进程返回用户空间前,会调用do_notify_resume()处理该进程的信号。