strange behavior of sig* functions

From: Alex Kirhenshtein <alk_at_DOMAIN_REMOVED>
Date: Wed, 23 Nov 2005 12:02:29 +0200

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