COHERENT manpages
This page displays the COHERENT manpage for signal() [Specify action to take upon receipt of a given signal].
List of available manpages
Index
signal() -- System Call (libc) Specify action to take upon receipt of a given signal #include <signal.h> int (*signal(sigtype, function))() int sigtype, (*function)(); A process can receive a signal, or interrupt, from a hardware exception, terminal input, or a kill() call made by another process. A hardware exception might be caused by an illegal instruction or a bad machine address. The terminal interrupt character (described in detail in the Lexicon entry tty) generates a process interrupt (and in one case a core dump file for debugging purposes). signal() tells the signal handler what to do when the current process receives signal sigtype. sigtype is the signal to process, as defined below. function points to the routine to execute when sigtype is received. This can be a function of your own creation; or you can use one of the following macros, which expand into pointers to system-defined functions: SIG_DFL This is the default action. The process terminates just as if it called the function exit(). In addition, the system writes a core file in the current working directory if sigtype is any of the following: SIGQUIT, SIGSYS, SIGTRAP, or SIGSEGV. (Note that this behavior applies only to executables for which you have write permission. If you lack write permission on an executable, then no core file is written.) For more information on core files, see the Lexicon entry core. SIG_IGN Ignore sigtype. The system discards all signals of this type. signal() returns a pointer to the previous action. If sigtype is not a recognized signal, signal() returns (int (*)())-1. With the exception of SIGKILL and SIGTRAP, caught signals are reset to the default action SIG_DFL. To catch a signal again, the routine to which function points must reissue the call to signal(). The following list names the signals that signal() can process, as defined in the header file signal.h. Note that the signal SIGKILL, which kills a process, can be neither caught nor ignored. Signals marked by an asterisk produce a core dump if the action is SIG_DFL: SIGHUP.........Hangup SIGINT.........Interrupt SIGQUIT*.......Quit SIGILL*........Illegal instruction SIGTRAP*.......Trace trap SIGIOT.........IOT instruction SIGABRT*.......To be replaced by SIGIOT SIGEMT.........Emulator trap SIGFPE*........Floating-point exception SIGKILL........Kill SIGBUS.........Bus error SIGSEGV*.......Segmentation violation SIGSYS*........Bad argument to system call SIGPIPE........Write to pipe with no readers SIGALRM........Alarm SIGTERM........Software termination signal SIGUSR1........User-defined signal SIGUSR2........User-defined signal SIGCLD.........Death of a child SIGCHLD........Death of a child SIGPWR.........Restart SIGWINCH.......Window change SIGPOLL........Polled event in stream A signal may be caught during a system call that has not yet returned. In this case, the system call appears to fail, with errno set to EINTR. If desired, such an interrupted system call may be reissued. System calls which may be interrupted in this way include pause(), read() on a device such as a terminal, write() on a pipe, and wait(). Example The following program demonstrates signal(), kill(), getpid(), and fork(). #include <signal.h> int got_it; /* Each side gets its own copy of all data at the fork */ int errset; /* * Control comes here on SIGTRAP. Do no I/O in signal function. * Reset the signal if you ever want another. */ void sig_ser() { got_it = 1; /* tell the child we got it */ if (0 > signal(SIGTRAP, sig_ser))/* reset the signal */ errset = 1; } main() { int count; int child, parent; parent = getpid(); /* Both sides will get a copy */ if (signal(SIGTRAP, sig_ser) < 0) {/* sets for both sides */ perror("signal set failed"); exit(0); } if (child = fork()) { /* parent gets the child's id */ for (count = 0; count < 3; count++) { kill(child, SIGTRAP); /* signal the child */ while(!got_it) /* wait for signal */ sleep(1); if (errset) perror("parent: signal reset failed"); printf("parent got signal %d\n", count); got_it = errset = 0; } exit(0); } for (count = 0; count < 3; count++) { while(!got_it) /* wait for signal */ sleep(1); if (errset) perror("child: signal reset failed"); printf("child got signal %d\n", count);/* show we got it */ kill(parent, SIGTRAP); /* signal the parent */ got_it = errset = 0; } exit(0); } See Also kill, kill(), libc, ptrace(), sh, sigaction(), signame, sigset() ANSI Standard, §7.7.1.1 Notes The function signal() predates the sigset() and sigaction() sets of signal- handling functions. Never combine signal() with any of the sigset() or sigaction() families of functions: use one or the other, but not both. For a description of how signal() differs from sigset() and sigaction(), see their Lexicon entries.