Re: sigaction.2: clarification for SA_NODEFER needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 12. November 2020 21:45:56 MEZ schrieb "Michael Kerrisk (man-pages)" <mtk.manpages@xxxxxxxxx>:
>On 11/12/20 5:25 PM, Heinrich Schuchardt wrote:
>
>[...]
>
>> Hello Michael,
>> 
>> this text is very helpful.
>> 
>> "Signal mask and pending signals" already mentions that the signal
>mask
>> controls the blocking of signals. But maybe you could reiterate this
>in
>> 1d) and in the note below 5).
>
>Yes, that perhaps does not hurt. Some light tweaks:
>
>   Execution of signal handlers
>     Whenever  there is a transition from kernel-mode to user-mode exe‐
>     cution (e.g., on return from a system  call  or  scheduling  of  a
>     thread onto the CPU), the kernel checks whether there is a pending
>     signal for which the process has established a signal handler.  If
>       there is such a pending signal, the following steps occur:
>
>     1. The  kernel performs the necessary preparatory steps for execu‐
>          tion of the signal handler:
>
>          a) The signal is removed from the set of pending signals.
>
>        b) If the thread has defined an alternate signal  stack  (using
>             sigaltstack(2)), then that stack is installed.
>
>        c) Various  pieces  of  signal-related context are saved into a
>           "hidden" frame that is created on the stack.  The saved  in‐
>             formation includes:
>
>           + the  program  counter  register  (i.e., the address of the
>             next instruction in the main program that should  be  exe‐
>               cuted when the signal handler returns);
>
>             + the thread's current signal mask;
>
>             + the thread's alternate signal stack settings.
>
>        d) The  thread's  signal  mask is adjusted by adding the signal
>           (unless the handler was  established  using  the  SA_NODEFER
>           flag)  as  well  as  any  additional  signals  specified  in
>           act->sa_mask when sigaction(2) was  called.   These  signals
>             are thus blocked while the handler executes.
>
>     2. The  kernel  constructs  a  frame for the signal handler on the
>        stack.  Within that frame, the return address points to a piece
>        of  user-space  code called the signal trampoline (described in
>          sigreturn(2)).
>
>     3. The kernel passes control back to user-space,  where  execution
>          commences at the start of the signal handler function.
>
>     4. When  the  signal handler returns, control passes to the signal
>          trampoline code.
>
>     5. The signal trampoline calls sigreturn(2), a  system  call  that
>        uses the information in the "hidden" stack frame to restore the
>        thread's signal mask and  alternate  stack  settings  to  their
>        state before the signal handler was called.  Upon completion of
>        the call to sigreturn(2), the kernel transfers control back  to
>        user  space,  and the thread recommences execution at the point
>          where it was interrupted by the signal handler.
>
>     Note that if the signal handler does not return (e.g., control  is
>     transferred  out  of  the  handler  using sigsetjmp(3) or swapcon‐
>     text(3), or the handler executes a new  program  with  execve(2)),
>     then the final step is not performed.  In particular, in such sce‐
>     narios it is the programmer's responsibility to restore the  state
>     of the signal mask, if it is desired unblock the signals that were
>       blocked on entry to the signal handler.

Is there a function to change the signal mask without leaving the handler?

Otherwise looks good to me.

Best regards

Heinrich

>
>Thanks,
>
>Michael





[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux