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

调用sigaction()时,如果将sa_sigaction设置为NULL,这意味着什么?,c,linux,unix,signals,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意味着什么?这是一种复杂的表达方式吗?我在中找不到任何

下面的代码做什么

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意味着什么?这是一种复杂的表达方式吗?我在中找不到任何有关此用法的引用


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

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_处理程序
成员,但是(同样,不要依赖于此)
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

NULL
可能被视为等同于
SIG_-DFL
?同样,来自文档的sa_处理程序应分配这些值,而不是
sa_-sigaction
。它恰好在当前glibc下工作,因为
sa_handler
sa_sigaction
在同一个联合体中实现。按照OP代码片段中显示的方式进行操作比不可重复执行/可移植的方式更方便。