Signal HandlingCS241 AdministrativeOutlineReview: How Signals WorkReview: Generating SignalsExamples: Programming SignalsProgramming SignalsSignal MasksSignal SetsSlide 10Slide 11SIGPROCMASKExample: Initialize Signal Set:Example: Add SIGINT to Set of Blocked SignalsSummaryCS 241 Spring 2007System Programming 1Signal HandlingLecture 15Klara Nahrstedt2CS241 AdministrativeRead Chapter 8.1-8.4 in R&R3OutlineLearn fundamentals of signal handlingExperiment with signals for controlExplore POSIX signal facilitiesUse signal masks and handlersSignals and threads4Review: How Signals WorkSignal GeneratedProcessSignal HandlerSignal deliveredSignal not blockedSignal Caught by handlerReturn from Signal HandlerProcess ResumedSignalMaskSignalMaskSignalMask5Review: Generating SignalsSignal has a symbolic name starting with SIGSignal names are defined in signal.hUsers can generate signals (e.g., SIGUSR1)OS generates signals when certain errors occur (e.g., SIGSEGV – invalid memory reference)Specific calls generate signals such as alarm (e.g., SIGALARM)6Examples: Programming SignalsFrom a program you can use the kill system call: #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); Example 8.4: send SIGUSR1 to process 3423: if (kill(3423, SIGUSR1) == -1) perror("Failed to send the SIGUSR1 signal"); Example 8.5: a child kills its parent: if (kill(getppid(), SIGTERM) == -1) perror ("Failed to kill parent");7Programming SignalsExample 8.5: a process sends a signal to itself: if (raise(SIGUSR1) != 0) perror("Failed to raise SIGUSR1"); Example 8.8: kill an infinite loop after 10 seconds: int main(void) { alarm(10); for ( ; ; ) ; }8Signal MasksProcess can temporarily prevent signal from being delivered by blocking it.Signal Mask contains a set of signals currently blocked.Important! Blocking a signal is different from ignoring signal. Why? When a process blocks a signal, the OS does not deliver signal until the process unblocks the signalA blocked signal is not delivered to a process until it is unblocked. When a process ignores signal, signal is delivered and the process handles it by throwing it away.9Signal SetsSignal set is of type sigset_tSignal sets are manipulated by five functions:#include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signo); int sigdelset(sigset_t *set, int signo); int sigismember(const sigset_t *set, int signo);10Signal Setssigemptyset initializes the set to contain no signalssigfillset puts all signals in the setsigaddset adds one signal to the setsigdelset removes one signal from the setsigismember tests to see if a signal is in the set11Signal MasksSigInt SigQuit SigKill … SigCont SigAbrt0 0 1 … 1 0SigMaskSignal SigInt Bit 2, Signal Sigkill Bit 9, Signal SigChld Bit 20A SIGSET is a collection of signals: #000003 is SIGHUP + SIGINT12SIGPROCMASKThe function sigprocmask is used to modify the signal mask. #include <signal.h>int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset)‘how’ specifies the manner in which the signal mask is to be modifiedSIG_BLOCK – add collection of signals to those currently blockedSIG_UNBLOCKED – delete collection of signals from the currently blockedSIG_SETMASK – set collection of signals being blocked to the specified set13Example: Initialize Signal Set: if ((sigemptyset(&twosigs) == -1) || (sigaddset(&twosigs, SIGINT) == -1) || (sigaddset(&twosigs, SIGQUIT) == -1)) perror("Failed to set up signal mask");14Example: Add SIGINT to Set of Blocked Signals sigset_t newsigset; if ((sigemptyset(&newsigset) == -1) || (sigaddset(&newsigset, SIGINT) == -1)) perror("Failed to initialize the signal set"); else if (sigprocmask(SIG_BLOCK, &newsigset, NULL) == -1) perror("Failed to block SIGINT"); If SIGINT is already blocked, the call to sigprocmask has no effect.15Summary Signals – asynchronous eventsGenerating signalsProgramming signalsSignal
View Full Document