lkml.org 
[lkml]   [2003]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectSignal left blocked after signal handler.
    From
    Hi,

    A signal should be blocked while its signal handler is executing, and
    then unblocked when the handler returns - unless SA_NOMASK is set.

    -test9 and -test10 leave the signal _blocked_forever_.

    This causes the build-time confidence test for Electric Fence to break,
    and no doubt lots of other code.

    If SA_NOMASK is set, the signal is not blocked.

    Test program attached below.

    Thanks

    Bruce

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <setjmp.h>

    static sigjmp_buf sjbuf;
    static int sig = SIGINT;

    static void
    handler(int i)
    {
    struct sigaction act;

    memset((void *)&act, 0, sizeof(act));
    act.sa_handler = SIG_DFL;

    fprintf(stderr, "Signal handler hit!\n");
    fflush(stderr);
    sigaction(sig, &act, 0);
    siglongjmp(sjbuf, 1);

    }

    static void
    invoke_signal()
    {
    struct sigaction act;

    memset((void *)&act, 0, sizeof(act));
    act.sa_handler = handler;

    /* act.sa_flags = SA_NOMASK; */

    if ( sigsetjmp(sjbuf, 0) == 0 ) {
    sigaction(sig, &act, 0);
    fprintf(stderr, "Sending signal... ");
    fflush(stderr);
    kill(getpid(), sig);
    fprintf(stderr, "Huh? Nothing happened. Signal was left blocked.\n");
    }
    }

    int
    main(int argc, char * * argv)
    {
    sigset_t set;

    sigemptyset(&set);
    sigaddset(&set, sig);

    invoke_signal();
    invoke_signal();
    fprintf(stderr, "Unblocking signal... ");
    if ( sigsetjmp(sjbuf, 0) == 0 ) {
    sigprocmask(SIG_UNBLOCK, &set, 0);
    }

    return 0;
    }
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:58    [W:0.031 / U:30.104 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site