0

在查找 sigaction 的手册页时,我偶然发现了 Linux 手册页中的一个令人困惑的注释:

在某些体系结构中涉及联合:不要同时分配给 sa_handler 和 sa_sigaction(sigaction 手册页)。

有两种可能的阅读方式:

  1. 据我了解,这是否意味着您不允许设置.sa_sigaction.sa_handler在同一个struct sigaction.
  2. 还是只允许在整个项目中使用.sa_sigactionOR ?.sa_handler
struct sigaction sigactionArray[SIGNAL_SIGACTION_ARRAY_SIZE] = {
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_IGN, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_handler = SIG_DFL, .sa_flags = SA_NODEFER},
   {.sa_sigaction = HandleBacktraceSignals, .sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK}
};

根据解释 1. 上面这段代码是可以的,但是当定义 2. 正确时,它会因为我混合而无效。

哪一个是真的?注意:在我的架构上,它被定义为一个联合

4

1 回答 1

1

它只是在谈论相同的结构。它解释了原因:它们可能是 a 的一部分union,因此它们在结构中使用相同的内存。例如,它实际上可能是这样的:

struct sigaction {
    union {
        void     (*sa_handler)(int);
        void     (*sa_sigaction)(int, siginfo_t *, void *);
    },
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

因此,写入其中一个会覆盖另一个。

于 2019-04-11T19:51:50.180 回答