예제 #1
0
int main()
{
    struct sigaction act;
    sigset_t ss;

    act.sa_sigaction = Handle;
    act.sa_flags = SA_SIGINFO;
    sigemptyset(&act.sa_mask);
    if (sigaction(SIGUSR1, &act, 0) != 0)
    {
        fprintf(stderr,"unable to set SIGUSR1 handler\n");
        return 1;
    }
    sigemptyset(&act.sa_mask);
    if (sigaction(SIGUSR2, &act, 0) !=0)
    {
        fprintf(stderr,"unable to set SIGUSR2 handler\n");
        return 1;
    }
    sigfillset(&ss);
    sigprocmask(SIG_SETMASK, &ss, 0);
    kill(getpid(), SIGUSR1);
    kill(getpid(), SIGUSR2);

    sigdelset(&ss, SIGUSR1);
    sigdelset(&ss, SIGUSR2);
    sigdelset(&ss, SIGSEGV);
    sigsuspend(&ss);

    sigprocmask(SIG_SETMASK, 0, &ss);
    CheckSigs(&ss, "After signal");
    return 0;
}
예제 #2
0
int main()
{
    sigset_t sigset;
    
    struct sigaction sa;
    sa.sa_handler = Handler;
    sa.sa_flags = 0;
    
    // Block sigterm in the handler
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGTERM);

    // Block USR1 here
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGUSR1);
    sigprocmask(SIG_BLOCK, &sigset, 0);
    
    sigaction(SIGWINCH, &sa, 0);

    fprintf(stderr,"Before signal1\n");
    fprintf(stderr,"--------------\n");
    CheckSigs();

    // the kernel blocks SIGWINCH in the handler
    kill(0, SIGWINCH);
    
    fprintf(stderr,"After signal1\n");
    fprintf(stderr,"--------------\n");
    CheckSigs();

    // No defer should not block SIGWINCH in handler
    sa.sa_flags |= SA_NODEFER;
    sigaction(SIGWINCH, &sa, 0);
    kill(0, SIGWINCH);

    fprintf(stderr,"After signal2\n");
    fprintf(stderr,"--------------\n");
    CheckSigs();

    return 0;
}
예제 #3
0
void Handler(int n)
{
    fprintf(stderr,"In handler\n");
    fprintf(stderr,"--------------\n");
    CheckSigs();
}