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/