(BSD System Compatibility)

sigvec(3bsd)


sigvec -- (BSD) software signal facilities

Synopsis

   /usr/ucb/cc [flag . . . ] file . . .
   

#include <signal.h>

int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);

Description

The system defines a set of signals that may be delivered to a process. Signal delivery resembles the occurrence of a hardware interrupt: the signal is blocked from further occurrence, the current process context is saved, and a new one is built. A process may specify a handler to which a signal is delivered, or specify that a signal is to be blocked or ignored. A process may also specify that a default action is to be taken by the system when a signal occurs. Normally, signal handlers execute on the current stack of the process. This may be changed, on a per-handler basis, so that signals are taken on a special signal stack.

All signals have the same priority. Signal routines execute with the signal that caused their invocation to be blocked, but other signals may yet occur. A global signal mask defines the set of signals currently blocked from delivery to a process. The signal mask for a process is initialized from that of its parent (normally 0). It may be changed with a sigblock(3bsd) or sigsetmask(3bsd) call, or when a signal is delivered to the process.

A process may also specify a set of flags for a signal that affect the delivery of that signal.

When a signal condition arises for a process, the signal is added to a set of signals pending for the process. If the signal is not currently blocked by the process then it is delivered to the process. When a signal is delivered, the current state of the process is saved, a new signal mask is calculated (as described below), and the signal handler is invoked. The call to the handler is arranged so that if the signal handling routine returns normally the process will resume execution in the context from before the signal's delivery. If the process wishes to resume in a different context, then it must arrange to restore the previous context itself.

When a signal is delivered to a process a new signal mask is installed for the duration of the process' signal handler (or until a sigblock or sigsetmask call is made). This mask is formed by taking the current signal mask, adding the signal to be delivered, and ORing in the signal mask associated with the handler to be invoked.

The action to be taken when the signal is delivered is specified by a sigvec structure, which includes the following members:

   void    (*sv_handler)();      /* signal handler */
   int     sv_mask;              /* signal mask to apply */
   int     sv_flags;             /* see signal options */
   

#define SV_ONSTACK /* take signal on signal stack */ #define SV_INTERRUPT /* do not restart system on signal return */ #define SV_RESETHAND /* reset handler to SIG_DFL when signal taken */

If the SV_ONSTACK bit is set in the flags for that signal, the system will deliver the signal to the process on the signal stack specified with sigstack(3bsd), rather than delivering the signal on the current stack.

If vec is not a NULL pointer, sigvec assigns the handler specified by sv_handler, the mask specified by sv_mask, and the flags specified by sv_flags to the specified signal. If vec is a NULL pointer, sigvec does not change the handler, mask, or flags for the specified signal.

The mask specified in vec is not allowed to block SIGKILL, SIGSTOP, or SIGCONT. The system enforces this restriction silently.

If ovec is not a NULL pointer, the handler, mask, and flags in effect for the signal before the call to sigvec are returned to the user. A call to sigvec with vec a NULL pointer and ovec not a NULL pointer can be used to determine the handling information currently in effect for a signal without changing that information.

The following is a list of all signals with names as in the include file /usr/include/signal.h:

SIGHUP   hangup
SIGINT   interrupt
SIGQUIT * quit
SIGILL * illegal instruction
SIGTRAP * trace trap
SIGABRT * abort (generated by abort(3C) routine)
SIGEMT * emulator trap
SIGFPE * arithmetic exception
SIGKILL   kill (cannot be caught, blocked, or ignored)
SIGBUS * bus error
SIGSEGV * segmentation violation
SIGSYS * bad argument to system call
SIGPIPE   write on a pipe or other socket with no one to read it
SIGALRM   alarm clock
SIGTERM   software termination signal
SIGURG BULLET urgent condition present on socket
SIGSTOP + stop (cannot be caught, blocked, or ignored)
SIGTSTP + stop signal generated from keyboard
SIGCONT BULLET continue after stop (cannot be blocked)
SIGCHLD BULLET child status has changed
SIGTTIN + background read attempted from control terminal
SIGTTOU + background write attempted to control terminal
SIGIO BULLET I/O is possible on a descriptor (see fcntl(2))
SIGPWR BULLET power fail/restart
SIGXCPU   cpu time limit exceeded (see getrlimit(2))
SIGXFSZ   file size limit exceeded (see getrlimit(2))
SIGVTALRM   virtual time alarm (see getitimer(3C))
SIGPROF   profiling timer alarm (see getitimer(3C))
SIGWINCH BULLET window changed (see termio(7))
SIGUSR1   user-defined signal 1
SIGUSR2   user-defined signal 2

 SIGHUP          hangup
 SIGINT          interrupt
 SIGQUIT     *   quit
 SIGILL      *   illegal instruction
 SIGTRAP     *   trace trap
 SIGABRT     *   abort (generated by
                 abort(3C) routine)
 SIGEMT      *   emulator trap
 SIGFPE      *   arithmetic
                 exception
 SIGKILL         kill (cannot be
                 caught, blocked, or
                 ignored)
 SIGBUS      *   bus error
 SIGSEGV     *   segmentation
                 violation
 SIGSYS      *   bad argument to
                 system call
 SIGPIPE         write on a pipe or
                 other socket with
                 no one to read it
 SIGALRM         alarm clock
 SIGTERM         software
                 termination signal
 SIGURG          urgent condition
                 present on socket
 SIGSTOP         stop (cannot be
                 caught, blocked, or
                 ignored)
 SIGTSTP         stop signal
                 generated from
                 keyboard
 SIGCONT         continue after stop
                 (cannot be blocked)
 SIGCHLD         child status has
                 changed
 SIGTTIN         background read
                 attempted from
                 control terminal
 SIGTTOU         background write
                 attempted to
                 control terminal
 SIGIO           I/O is possible on
                 a descriptor (see
                 fcntl(2)
 SIGPWR          power fail/restart
 SIGXCPU         cpu time limit
                 exceeded (see
                 getrlimit(2)
 SIGXFSZ         file size limit
                 exceeded (see
                 getrlimit(2)
 SIGVTALRM       virtual time alarm
                 (see getitimer(3C)
 SIGPROF         profiling timer
                 alarm (see
                 getitimer(3C)
 SIGWINCH        window changed (see
                 termio(7)
 SIGUSR1         user-defined signal
                 1
 SIGUSR2         user-defined signal
                 2

The starred signals in the list above cause a core image if not caught or ignored.

Once a signal handler is installed, it remains installed until another sigvec call is made, or an execve (see exec(2)) is performed, unless the SV_RESETHAND bit is set in the flags for that signal. In that case, the value of the handler for the caught signal will be set to SIG_DFL before entering the signal-catching function, unless the signal is SIGILL, SIGPWR, or SIGTRAP. Also, if this bit is set, the bit for that signal in the signal mask will not be set; unless the signal mask associated with that signal blocks that signal, further occurrences of that signal will not be blocked. The SV_RESETHAND flag is not available in 4.2BSD, hence it should not be used if backward compatibility is needed.

The default action for a signal may be reinstated by setting the signal's handler to SIG_DFL; this default is termination except for signals marked with BULLET or +. Signals marked with BULLET are discarded if the action is SIG_DFL; signals marked with + cause the process to stop. If the process is terminated, a core image will be made in the current working directory of the receiving process if the signal is one for which an asterisk appears in the above list (see core(4)).

If the handler for that signal is SIG_IGN, the signal is subsequently ignored, and pending instances of the signal are discarded.

If a caught signal occurs during certain system calls, the call is normally restarted. The call can be forced to terminate prematurely with an EINTR error return by setting the SV_INTERRUPT bit in the flags for that signal. The SV_INTERRUPT flag is not available in 4.2BSD, hence it should not be used if backward compatibility is needed. The affected system calls are read(2) or write(2) on a slow device (such as a terminal or pipe or other socket, but not a file) and during a wait(2).

After a fork(2) or vfork(2) the child inherits all signals, the signal mask, the signal stack, and the restart/interrupt and reset-signal-handler flags.

The execve call (see exec(2)) resets all caught signals to default action and resets all signals to be caught on the user stack. Ignored signals remain ignored; the signal mask remains the same; signals that interrupt system calls continue to do so.

The accuracy of addr is machine dependent. For example, certain machines may supply an address that is on the same page as the address that caused the fault. If an appropriate addr cannot be computed it will be set to SIG_NOADDR.

Return values

A 0 value indicates that the call succeeded. A -1 return value indicates that an error occurred and errno is set to indicate the reason.

Errors

sigvec will fail and no new signal handler will be installed if one of the following occurs:

EFAULT
Either vec or ovec is not a NULL pointer and points to memory that is not a valid part of the process address space.

EINVAL
Sig is not a valid signal number, or, SIGKILL, or SIGSTOP.

References

exec(2), fcntl(2), fork(2), getitimer(3C), getrlimit(2), ioctl(2), kill(2), ptrace(2), read(2), setjmp(3bsd), sigblock(3bsd), signal(2), signal(3bsd), sigpause(3bsd), sigsetmask(3bsd), sigstack(3bsd), streamio(7), termio(7), umask(2), wait(2), wait(3bsd), write(2)

Notices

SIGPOLL is a synonym for SIGIO. A SIGIO will be issued when a file descriptor corresponding to a STREAMS (see intro(2)) file has a ``selectable'' event pending. Unless that descriptor has been put into asynchronous mode (see fcntl(2)), a process must specifically request that this signal be sent using the I_SETSIG ioctl call (see streamio(7)). Otherwise, the process will never receive SIGPOLL.

The handler routine can be declared:

   void handler(sig, code, scp, addr)
   int sig, code;
   struct sigcontext *scp;
   char *addr;

Here sig is the signal number; code is a parameter of certain signals that provides additional detail; scp is a pointer to the sigcontext structure (defined in signal.h), used to restore the context from before the signal; and addr is additional address information.

The signals SIGKILL and SIGSTOP cannot be ignored.


© 2004 The SCO Group, Inc. All rights reserved.
UnixWare 7 Release 7.1.4 - 25 April 2004