【问题标题】:what does it mean if sa_sigaction is set to NULL when calling sigaction()?如果在调用 sigaction() 时将 sa_sigaction 设置为 NULL,这意味着什么?
【发布时间】:2014-06-06 10:41:48
【问题描述】:

下面的代码是做什么的?

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) 的答案感兴趣。

【问题讨论】:

  • NULL 可能被视为等同于 SIG_DFL?

标签: c linux unix signals


【解决方案1】:

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 联合,因此分配 NULLsa_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

【讨论】:

  • 同样来自文档 sa_handler 应分配这些值,而不是 sa_sigaction。它恰好在当前的 glibc 下工作,因为 sa_handlersa_sigaction 在同一个联合中实现。在 OP 的 sn-p 中显示的操作比 un-reliebale/-portable 更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2016-06-28
  • 1970-01-01
相关资源
最近更新 更多