threads and signals

Samuel Thibault samuel.thibault@ens-lyon.org
Tue Aug 23 20:52:00 GMT 2005


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
-------------- next part --------------
#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");
	}
}

-------------- next part --------------
--
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/


More information about the Cygwin mailing list