What is sigaddset used for?
alarm, c, linux, posix, signals
Solution
You are doing 2 things here:
Populating a `sigset_t`. A sigset_t is just a collection of values for signals, and are used in various system calls. You can:
- Create an empty sigset_t (sigemptyset()
- Add a signal to the set (sigaddset())
- Remove a signal to the set (sigdelset())
- etc...
Setting the signal mask for the signal handler. You do that by manipulating the `sigset_t sa_mask` member of the `struct sigaction` when you set up a signal handler in with a call to sigaction().
The signal mask of a signal handler means that while the signal handler is executing, the signals that are in the mask will be blocked - i.e. those signals will not be handled as long as they are blocked. When the signal handler are finished, the signals in will be unblocked. A signal that is blocked isn't "lost", it will be handled when that particular signal is unblocked again.
The `sigaddset(&act.sa_mask, SIGINT);` means the the SIGINT signal cannot occur while the code for the `SIGALRM` handler is running.
On the other hand, if you comment out `sigaddset(&act.sa_mask, SIGINT);`, you're left with just an empty list of signals created with `sigemptyset(&act.sa_mask);`. So any signals that occur while the SIGALRM handler function is running might preempt that handler and execute the signal handler for that other signal.
For a SIGINT, you would normally not notice any difference with manual testing - it's unlikely you manage to hit CTRL-C exactly when your handler for SIGALRM is running, and your SIGALRM handler probably runs quickly enough that you would not notice if the SIGINT was slightly delayed.
Problem
I have this code where I use sigaddset and sigaction. However if I comment segaddset the result is the same ``` struct sigaction act; act.sa_handler = process_alarm; act.sa_flags = 0; sigemptyset(&act.sa_mask); //sigaddset(&act.sa_mask, SIGINT); sigaction(SIGALRM, &act, NULL); for(;;) { alarm(3); pause(); } ``` Why do I need to use it?