1
CS644 week 8:
Signals
Signal basics
2
Signals – asynchronous alerts,
sent by OS or by another process
3
Signal basics
SIGTERM – requests termination
SIGKILL – forces termination
SIGCHLD – notifies parent of child's exit
4
Signal basics
Every signal has a disposition:
ignore, default, or call handler
5
Signal basics
Signals can be (temporarily) masked
6
Signal basics
Masking – signals received are kept pending
Ignoring – signals received are discarded
7
Signal basics
Syscalls
8
int kill(
pid_t pid,
int sig,
)
9
Syscalls
int sigaction(
int signum,
struct sigaction* act,
struct sigaction* old,
)
10
Syscalls
struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
}
11
Syscalls
int sigprocmask(
int how,
sigset_t* set,
sigset_t* old,
)
12
Syscalls
sigprocmask(
SIG_BLOCK, ...);
sigprocmask(
SIG_UNBLOCK, ...);
sigprocmask(
SIG_SETMASK, ...);
13
Syscalls
int sigemptyset(sigset_t*);
int sigfillset(sigset_t*);
int sigaddset(
sigset_t*, int signo);
int sigdelset(
sigset_t*, int signo);
14
Syscalls
int pause()
int sigwait(
sigset* set,
int* sig,
)
15
Syscalls
Signals are hard
16
Signals are concurrent and preemptive
17
Signal are hard
Many functions are not safe to call inside a signal handler
18
Signal are hard
pause is perilous – missed-wait problem
19
Signal are hard
Signals can interrupt syscalls (EINTR)
20
Signal are hard
Signals and multithreading
21
Dispositions are per-process, masks are per-thread
22
Signal and multithreading
A signal is delivered to a particular thread, not all of them
23
Signal and multithreading
Use pthread_sigmask instead of sigprocmask
24
Signal and multithreading
What should I do?
25
Is default behavior OK?
26
What should I do?
Graceful shutdown: catch SIGTERM, set flag or self-pipe trick, handle in main loop
27
What should I do?
Need something more complicated? Be careful!
28
What should I do?
In-class exercises
29
Let's catch a signal!
30
In-class exercises