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    [from the cache]
©2003-2014 Jasper Spaans. Advertise on this site