Mail Archives: cygwin/2005/08/23/16:52:16
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
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
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="test.c"
#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");
}
}
--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
--
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/
--uAKRQypu60I7Lcqm--
- Raw text -