Provided by: rtlinux_3.1pre3-2_i386
sigaction — RTLinux POSIX signal handling functions
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
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
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.