如果在调用sigaction()时sa_sigaction设置为NULL,这意味着什么?

时间:2014-06-06 10:41:49

标签: c linux unix signals

以下代码有何作用?

struct sigaction saStruct;
saStruct.sa_flags = SA_NOCLDWAIT|SA_NODEFER|SA_SIGINFO;
saStruct.sa_sigaction = NULL;
sigemptyset(&saStruct.sa_mask);
sigaction(SIGCHLD, &saStruct, NULL);

特别是,sa_sigaction设置为NULL意味着什么?这是一种表达更简单的复杂方式吗?我在sigaction man page中找不到对此用法的任何引用。

我主要对Linux的答案感兴趣(> = 2.6)。

1 个答案:

答案 0 :(得分:2)

NULL恰好等同于SIG_DFL;不要依赖于此。

#define SIG_ERR  ((__sighandler_t) -1)  /* Error return.  */
#define SIG_DFL  ((__sighandler_t)  0)  /* Default action.  */
#define SIG_IGN  ((__sighandler_t)  1)  /* Ignore signal.  */

SIG_DFL等旨在分配给sa_handler成员,但是(并且不再依赖于此)sa_handler在Linux上与... { sa_sigaction因此,将NULL分配给sa_sigaction等同于将SIG_DFL分配给sa_handler

    union
      {
        /* Used if SA_SIGINFO is not set.  */
        __sighandler_t sa_handler;
        /* Used if SA_SIGINFO is set.  */
        void (*sa_sigaction) (int, siginfo_t *, void *);
      }
    __sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction   __sigaction_handler.sa_sigaction