Hi,

The attached program doesn't work as expected: if I run it and try to
kill it (-15), nothing seem happens. I if comment out pthread_sigmask(),
it does work as expected: the handler is called, and threads are
interrupted. What's more: if I move pthread_sigmask() after the pause()
call in the foo() function, killing works twice, but no more.

It seems like signal masks are not handled per-thread, and the source
code for pthread_sigmask seems to confirm that. This can pose problem
with signal distribution for some programs which require posix semantic
here.

Regards,
Samuel
#include <unistd.h>
#include <windows.h>
#include <signal.h>
#include <stdio.h>
#include <pthread.h>
void *foo(void* bar) {
        sigset_t blocked;
        sigemptyset(&blocked);
        sigaddset(&blocked,SIGTERM);
        pthread_sigmask(SIG_BLOCK,&blocked, NULL);
        while(1) {
                pause();
                fprintf(stderr,"thread %d awaken\n",(int)bar);
        }
}
void handler(int foo) {
        fprintf(stderr,"foo %d\n",foo);
}
void setsig(int foo) {
        struct sigaction action;
        memset(&action, 0, sizeof(action));
        sigemptyset(&action.sa_mask);
        action.sa_handler = handler;
        if (sigaction(foo, &action, NULL) == -1)
                perror("sigaction");
}
int main(int argc, char*argv[]) {
        pthread_t t;
        setsig(SIGTERM);
        pthread_create(&t,NULL,foo,0);
        while (1) {
                pause();
                fprintf(stderr,"main awaken");
        }
}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to