以下代码有何作用?
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)。
答案 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