Rawhi
Rawhi

Reputation: 6403

Blocking Signals for a Handler

I have set a handler for each signal (SIGCHLD, SIGTSTP, SIGINT), now I need to block other signals while some handler running .
There is some resources like sigaction(2) and Blocking for Handler , but I didn't understand what should I do in my situation or how to use the code .
little information :
handlers : sigchldHandler, sigintHandler, sigtstpHander => signals.c
there is a file called smash.c which contains an infinite loop to get commands all the time .
thanks in advance

Upvotes: 1

Views: 5003

Answers (1)

nos
nos

Reputation: 229058

When setting up the sigaction, you can specify a mask of signals that should be blocked when the handler is running.

You use it like so:

struct sigaction act;
sigset_t set;

memset(&act,0,sizeof act);
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGSTP);

act.sa_mask = set;
act.sa_handler = sigchldHandler;
act.sa_flags = SA_RESTART;

sigaction(SIGCHLD, &act, NULL);

This will block SIGUSR1 and SIGSTP while your handler for SIGCHLD is running. Do the same for your 2 other handlers as well.

Upvotes: 6

Related Questions