sigaction(2)                  System Calls Manual                 sigaction(2)

       sigaction — RTLinux POSIX signal handling functions

       #include <posix/signal.h>

       int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

       int  sigprocmask(int  how,  const  sigset_t *set, sigset_t *oldset);

       Signals interactions with pthreads is one of the less well defined and
       most contentious parts of POSIX. Many problems come from the
       interaction between process signals and thread signals. RTLinux V3.0
       uses the concept of process signals to provide an interface to hard
       interrupt handlers. The signals RTL_SIGIRQMIN  to  RTL_SIGIRQMIN +
       NR_IRQS refer to global hardware interrupts, and installing signal
       handlers is the same as installing interrupt handlers.

       RTLinux provides the POSIX sigaction function to install handlers for
       hardware interrupts and also to provide POSIX signaling (this is
       incomplete in V3.0).

       signum specifies the signal and can be any valid signal except SIGKILL
       and SIGSTOP.

       If act is non-null, the new action for signal signum is installed from
       act.  If oldact is non-null, the previous action is saved in oldact.

       The sigaction structure is defined as

              struct sigaction{
       void (*sa_handler)(int);
       sigset_t sa_mask;
       int sa_flags;
       void (*sa_restorer)(void);
       unsigned int sa_focus;

       The sa_focus field is an RTLinux-specific extension that is a bit map
       defining which processors on an SMP system can accept these interrupts.
       This is machine-specific and may only be used for hardware interrupts
       using the RTL_SIGIRQMIN+n, to catch hardware interrupt n.

       sa_handler specifies the action to be associated with signum and may be
       SIG_DFL for the default action, SIG_IGN to ignore this signal, or a
       pointer to a signal handling function.

       sa_mask  gives  a  mask of signals which should be blocked during
       execution of the signal handler.  In addition,  the signal which
       triggered the handler will be blocked, unless the SA_NODEFER or
       SA_NOMASK flags are used. In V3 and prior RTLinux these flags have no
       effect. Furthermore, when a signal handler for a hard interrupt is
       entered all interrupts are blocked by default.

       sa_flags specifies a set of flags which modify the behaviour of the
       signal handling process.  In RTLinux V3.0 and earlier these flags are

       The sa_focus element is used to direct a hardware interrupt to a
       particular set of processors in an SMP system.  This element has no
       effiect on soft-interrupts, on processor-specific interrupts (e.g.
       local timers and IPIs), on uni-processor systems, or where the
       interrupt control logic does not support interrupt focus.

       The sigprocmask call is used to change the list of currently blocked
       signals in a single threaded process.  POSIX states that the
       sigprocmask call has undefined operation in a multi-threaded process.
       In RTLinux, if the pthreads-based scheduling module (rtl_sched) is
       loaded or otherwise activated, the RT process is multithreaded and
       sigprocmask behavior undefined, unless the ``how'' variable is set to
       SIG_DISABLE or SIG_ENABLE.  These two flags are RTLinux extensions.
       The behaviour of the call is dependent on the value of how, as follows.

       SIG_BLOCK The set of blocked signals is the union of the current set
                 and the set argument.

                 The signals in set are removed from the current set of
                 blocked signals.  It is legal to attempt to unblock a  signal
                 which  is  not blocked.

                 The  set  of  blocked  signals is set to the argument set.

                 Turns on local processor interrupts.

                 Turns on local processor interrupts.

       Note that in RTLinux, as in POSIX,  not all signals can be masked or

       If oldset is non-null, the previous value  of  the  signal mask is
       stored in oldset.

       sigaction, sigprocmask, sigpending and sigsuspend return 0 on success
       and -1 on error.

       EINVAL    An invalid signal was specified.  This will also be generated
                 if  an  attempt  is  made  to change the action for SIGKILL
                 or  SIGSTOP,  which  cannot  be caught.

       EFAULT    act,oldact, set or oldset point to memory which is not a
                 valid part of the process address space.

       EINTR     System call was interrupted. This cannot happen in RTLinux
                 V3.0 or prior.

       It is not possible to block SIGKILL or  SIGSTOP  with  the sigprocmask
       call.   Attempts  to  do  so will be silently ignored. RTLinux also
       adds an additional set of unmaskable and uncatchable signals.

       According to POSIX, the behaviour of a  process  is  undefined after it
       ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by
       the kill() or the raise()  functions.  Integer division by zero has
       undefined result.  On some architectures  it  will  generate  a SIGFPE
       signal.  (Also, dividing the most negative integer by -1 may generate
       SIGFPE.)  Ignoring this signal might lead to  an  endless loop.

       SIGCHLD cannot happen in V3.0 RTLinux or prior, since there is no way
       to create child processes.

       The POSIX spec only defines SA_NOCLDSTOP.   Use  of  other sa_flags is

       sigaction can be called with a  null  second  argument  to query  the
       current signal handler. It can also be used to check whether a given
       signal  is  valid  for  the  current machine, by  calling it  with null
       second and third arguments.

       UNIX spec sigaction (link to URL ../susv2/xsh/sigaction.html) , UNIX
       spec kill(2) (link to URL ../susv2/xsh/kill.html)

       ©2001 FSMLabs Inc.

       All rights reserved.