small test app attached, it should handle ^C (SIGINT)
compile:
freebsd, modern linuxes:
gcc sigtest.c -o sigtest -pthread
others sane systems:
gcc sigtest.c -o sigtest -lpthread
run (and press ^C when started):
1)
alk_at_ns$ ./sigtest
signal_manager() in main thread
empty=0
add=0
procmask=0
^C
wait=0
sig=2
done
2) ./sigtest anything
alk_at_ns$ ./sigtest 1
signal_manager() in new thread
empty=0
add=0
procmask=0
^C
wait=0
sig=2
done
--------------
look like freebsd 5.x silently ignore sig* functions when they are
called from main thread (case #1)
---------------
tested:
FreeBSD 4.10-RELEASE : 1 - ok, 2 - ok
FreeBSD 5.3-RELEASE : 1 - *failed*, 2 - ok
Linux 2.6.14-gentoo-r2 : 1 - ok, 2 - ok
please check other systems if possible.
-- Alex Kirhenshtein C.T.Co Cellular: +371-9145688
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
int x = 0;
static void signal_manager();
static void *thr (void *arg)
{
while(1)
{
if (x == 1)
{
printf("done\n");
break;
}
}
return NULL;
}
static void *sig (void *arg)
{
signal_manager();
}
static void signal_manager()
{
int sig = 0;
sigset_t sigs;
printf("empty=%d\n", sigemptyset(&sigs));
printf("add=%d\n", sigaddset(&sigs, SIGINT));
printf("procmask=%d\n", sigprocmask(SIG_BLOCK, &sigs, NULL));
while(1)
{
printf("\n\nwait=%d\n", sigwait(&sigs, &sig));
printf("sig=%d\n", sig);
switch (sig)
{
case SIGINT:
x = 1;
return;
}
}
}
int main(int argc, const char *argv[])
{
pthread_t t1, t2;
if (pthread_create(&t1, NULL, thr, NULL) != 0)
{
return 1;
}
if (argc == 1)
{
printf("signal_manager() in main thread\n");
signal_manager();
}
else
{
printf("signal_manager() in new thread\n");
if (pthread_create(&t2, NULL, sig, NULL) != 0)
{
return 2;
}
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
Received on Wed Nov 23 2005 - 12:02:29 EET
This archive was generated by hypermail 2.2.0 : Wed Nov 23 2005 - 12:15:57 EET