We assume that the kernel has noticed the arrival of a signal and has invoked one of the functions in the previous section to prepare the process descriptor of the process that is supposed to receive the signal. But in case that process was not running on the CPU at that moment, the kernel deferred the task of waking the process, if necessary, and making it receive the signal. We now turn to the activities that the kernel performs to ensure that pending signals of a process are handled.
As mentioned in Section 4.7.1 in Chapter 4, the kernel checks whether there are nonblocked pending signals before allowing a process to resume its execution in User Mode. This check is performed in ret_from_intr( ) every time an interrupt or an exception has been handled by the kernel routines.
In order to handle the nonblocked pending signals, the kernel invokes the do_signal( ) function, which receives two parameters:
The address of the stack area where the User Mode register contents of the current process have been saved
The address of a variable where the function is supposed to save the bit mask array of blocked signals (actually, this parameter is NULL when invoked from ret_from_intr( ))
The function starts by checking whether the interrupt occurred while the process was running in User Mode; if not, it simply returns:
if ((regs->xcs & 3) != 3) return 1;
However, as we'll see in Section 9.3.4, this does not mean that a system call cannot be interrupted ...