开发者

How to set the sa_mask in sigset_t?

开发者 https://www.devze.com 2023-03-26 02:42 出处:网络
gcc (GCC) 4.6.0 c89 I have a signal handler declared like this: /* Setup signal handler */ struct sigaction new_action;

gcc (GCC) 4.6.0 c89

I have a signal handler declared like this:

   /* Setup signal handler */
    struct sigaction new_action;
    new_action.sa_handler = g_signal_handler;
    new_action.sa_flags = SA_ONSTACK;

    if(sigaction(SIGINT, &new_action, NULL) == -1) {
        fprintf(stderr, "Failed to setup sig开发者_C百科nal handlers.");
        return -1;
    }

When I was running my code through valgrind i.e. valgrind --leak-check=full it picked up the following error:

==5206== Syscall param rt_sigaction(act->sa_mask) points to uninitialised byte(s)
==5206==    at 0x347A435455: __libc_sigaction (in /lib64/libc-2.14.so)

So aftering looking at the man pages I decided to set like this, just to test with:

new_action.sa_mask = SA_NODEFER;

However, that just give me the following error:

error: incompatible types when assigning to type ‘__sigset_t’ from type ‘int’

Many thanks for any suggestions,


Try this:

/* Signals blocked during the execution of the handler. */
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGINT);

The sa_mask field allows us to specify a set of signals that aren’t permitted to interrupt execution of this handler. In addition, the signal that caused the handler to be invoked is automatically added to the process signal mask.

0

精彩评论

暂无评论...
验证码 换一张
取 消