COHERENT manpages
This page displays the COHERENT manpage for sigset() [Specify action to take upon receipt of a given signal].
List of available manpages
Index
sigset() -- System Call (libc) Specify action to take upon receipt of a given signal #include <signal.h> void (*sigset (sigtype, function))() int sigtype; void (*function)(); sigset() tells the signal handler what to do when the current process receives signal sigtype. sigtype identifies the signal being sought. For a list of recognized signals, see the Lexicon entry for signal(). Note that the signal SIGKILL, which kills a process, can be neither caught nor ignored. function points to the function to be executed 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, SIGSEGV, or SIGSYS. For more information on core files, see the Lexicon entry core. SIG_IGN Ignore sigtype. The system discards all signals of this type. SIG_HOLD Hold sigtype. The signal is held until the process calls sigrelse() to release it. Once the signal is released, it is processed as defined by sigset(). Only one ``copy'' of sigtype can be held at any given time. If all goes well, sigset() returns a pointer to the routine that had previously been in place to process sigtype. If something goes wrong (e.g., sigtype is not defined in signal.h), sigset() returns SIG_ERR and sets errno to an appropriate value. sigset() Versus signal() The COHERENT system also include the system call signal(), which also handles signals. signal() predates sigset() and its related functions sighold(), sigignore(), sigpause(), and sigrelse(). You should never combine signal() with the sigset() family of functions: use one or the other, but not both. The sigset() functions differ from signal() in the way they handle signals while a signal is being processed: signal() automatically invokes SIG_DFL for sigtype while its function is executing; whereas sigset() and its related functions invoke SIG_HOLD. Thus, with signal(), sending signal sigtype to a program while that signal's function is already executing will trigger the default action, which in most instances is to exit from the program. The signal-handling function itself can call signal() to reset the signal-handler to point to itself or another function; however, there remains a brief interval of vulnerability between the time the signal-processing function is called and the time it calls signal() to program the signal handler. With sigset(), however, if another sigtype is received while its function processing, the signal handler holds it, and releases it automatically after function returns. sigset() also differs from signal() in the way in which the signal-handler is reset once sigtype has been processed. With signal(), function is automatically reset to SIG_DFL just before a signal of type sigtype is processed. If you wish sigtype always to be processed by function, you must explicitly re-invoke signal() for sigtype within function. However, the sigset() family of routines always process sigtype by the routine to which function points until you explicitly change it. See Also libc, sighold(), sigignore(), signal(), sigpause(), sigrelse() Notes Functions called from within a signal handler should be re-entrant; this includes the standard I/O library. Thus, in general, it is not a good idea to call printf() from inside a signal handler. The risk is that a signal will arrive while the main program is updating a static structure, or calling malloc(); then the signal handler will run when something is not in a consistent state, with unpredictable results.