Search code examples
cshellsignalsblockingsigchld

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


Solution

  • 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.