signal(3) signal(3)
NAME
signal - specify what to do upon receipt of a signal
SYNOPSIS
#include <signal.h>
int (*signal (sig, func))()
int sig;
void (*func)();
DESCRIPTION
signal allows the calling process to choose one of three
ways in which it is possible to handle the receipt of a
specific signal. sig specifies the signal and func
specifies the choice.
sig can be assigned any one of the following except SIGKILL:
SIGHUP 01 hangup
SIGINT 02 interrupt
SIGQUIT 03* quit
SIGILL 04* illegal instruction (not reset when caught)
SIGTRAP 05* trace trap (not reset when caught)
SIGIOT 06* IOT instruction
SIGEMT 07* EMT instruction
SIGFPE 08* floating point exception
SIGKILL 09 kill (cannot be caught or ignored)
SIGBUS 10* bus error
SIGSEGV 11* segmentation violation
SIGSYS 12* bad argument to system call
SIGPIPE 13 write on a pipe with no one to read it
SIGALRM 14 alarm clock
SIGTERM 15 software termination signal
SIGUSR1 16 user defined signal 1
SIGUSR2 17 user defined signal 2
SIGCLD 18 death of a child (see WARNING below)
SIGPWR 19 power fail (see WARNING below)
See below for the significance of the asterisk ( * ) in the above list.
func is assigned one of three values: SIGDFL, SIGIGN, or a
function address. The actions prescribed by these values
are as follows:
SIGDFL - terminate process upon receipt of a signal
Upon receipt of the signal sig, the receiving process is
to be terminated with the following consequences:
All of the receiving process's open file descriptors
will be closed.
If the parent process of the receiving process is
executing a wait, it will be notified of the
Page 1 (last mod. 1/15/87)
signal(3) signal(3)
termination of the receiving process and the
terminating signal's number will be made available to
the parent process; see wait(2).
If the parent process of the receiving process is not
executing a wait, the receiving process will be
transformed into a zombie process (see exit(2) for
definition of zombie process).
The parent process ID of each of the receiving
process's existing child processes and zombie
processes will be set to 1. This means the
initialization process (see intro(2)) inherits each of
these processes.
Each attached shared memory segment is detached and
the value of shmnattach in the data structure
associated with its shared memory identifier is
decremented by 1.
For each semaphore for which the receiving process has
set a semadj value (see semop(2)), that semadj value
is added to the semval of the specified semaphore.
If the process has a process, text, or data lock, an
unlock is performed (see plock(2)).
An accounting record will be written on the accounting
file if the system's accounting routine is enabled;
see acct(2).
If the receiving process's process ID, tty group ID,
and process group ID are equal, the signal SIGHUP will
be sent to all of the processes that have a process
group ID equal to the process group ID of the
receiving process.
A ``core image'' will be made in the current working
directory of the receiving process if sig is one for
which an asterisk appears in the above list and the
following conditions are met:
The effective user ID and the real user ID of the
receiving process are equal.
An ordinary file named core exists and is writable
or can be created. If the file must be created, it
will have the following properties:
a mode of 0666 modified by the file creation
mask (see umask(2))
Page 2 (last mod. 1/15/87)
signal(3) signal(3)
a file owner ID that is the same as the
effective user ID of the receiving process
a file group ID that is the same as the
effective group ID of the receiving process
SIGIGN - ignore signal
The signal sig is to be ignored.
Note: the signal SIGKILL cannot be ignored.
function address - catch signal
Upon receipt of the signal sig, the receiving process is
to execute the signal-catching function pointed to by
func. The signal number sig will be passed as the only
argument to the signal-catching function. Additional
arguments are passed to the signal-catching function for
hardware-generated signals. Before entering the signal-
catching function, the value of func for the caught
signal will be set to SIGDFL unless the signal is
SIGILL, SIGTRAP, or SIGPWR.
Upon return from the signal-catching function, the
receiving process will resume execution at the point it
was interrupted.
When a signal that is to be caught occurs during a read,
a write, an open, or an ioctl system call on a slow
device (like a terminal; but not a file), during a pause
system call, or during a wait system call that does not
return immediately due to the existence of a previously
stopped or zombie process, the signal-catching function
will be executed and then the interrupted system call may
return a -1 to the calling process with errno set to
EINTR.
Note: The signal SIGKILL cannot be caught.
A call to signal cancels a pending signal sig except for a
pending SIGKILL signal.
signal will fail if sig is an illegal signal number,
including SIGKILL. [EINVAL]
If a process uses job control, or if it is invoked by a
shell using job control, the process may receive an extended
set of signals. These are described in sigvec(2).
RETURN VALUE
Upon successful completion, signal returns the previous
value of func for the specified signal sig. Otherwise, a
value of -1 is returned and errno is set to indicate the
Page 3 (last mod. 1/15/87)
signal(3) signal(3)
error.
SEE ALSO
kill(1), kill(2), pause(2), ptrace(2), set42sig(2).
setcompat(2). wait(2), setjmp(3C).
WARNING
Two other signals that behave differently than the signals
described above exist in this release of the system; they
are:
SIGCLD 18 death of a child (reset when caught)
SIGPWR 19 power fail (not reset when caught)
There is no guarantee that, in future releases of the UNIX®
system, these signals will continue to behave as described
below; they are included only for compatibility with other
versions of the UNIX system. Their use in new programs is
strongly discouraged.
For these signals, func is assigned one of three values:
SIGDFL, SIGIGN, or a function address. The actions
prescribed by these values of are as follows:
SIGDFL - ignore signal
The signal is to be ignored.
SIGIGN - ignore signal
The signal is to be ignored. Also, if sig is SIGCLD, the
calling process's child processes will not create zombie
processes when they terminate; see exit(2).
function address - catch signal
If the signal is SIGPWR, the action to be taken is the
same as that described above for func equal to function
address. The same is true if the signal is SIGCLD
except, that while the process is executing the signal-
catching function, any received SIGCLD signals will be
queued and the signal-catching function will be
continually reentered until the queue is empty.
The SIGCLD affects two other system calls (wait(2), and
exit(2)) in the following ways:
wait If the func value of SIGCLD is set to SIGIGN and a
wait is executed, the wait will block until all of
the calling process's child processes terminate; it
will then return a value of -1 with errno set to
ECHILD.
exit If in the exiting process's parent process the func
value of SIGCLD is set to SIGIGN, the exiting
Page 4 (last mod. 1/15/87)
signal(3) signal(3)
process will not create a zombie process.
When processing a pipeline, the shell makes the last process
in the pipeline the parent of the proceeding processes. A
process that may be piped into in this manner (and thus
become the parent of other processes) should take care not
to set SIGCLD to be caught.
BUGS
If a repeated signal arrives before the last one can be
reset, there is no chance to catch it.
The type specification of the routine and its func argument
are problematical.
The symbols sighnd and sigtrap are globally defined symbols
used by signal and are reserved words.
Page 5 (last mod. 1/15/87)