如何在 sigaction.sa_flags 中设置多个标志

How to set more than one flag in sigaction.sa_flags

我有以下结构:

struct sigaction sa1;
sa1.sa_flags=SA_SIGINFO;
sa1.sa_flags=SA_NODEFER;
sa1.sa_sigaction = handler;
sigaction(SIGUSR1,&sa1,NULL);

如何将 SA_SIGINFO 与 SA_NODEFER 一起使用,而不使第二个标志覆盖第一个标志?

The manual page 有答案:

It is formed by the bitwise OR of zero or more of the following: [...]

所以你会做类似的事情

sa1.sa_flags = SA_NODEFER | SA_SIGINFO;

这种将多个独立标志表示为整数中的单个位的方式在所有编程中都非常常见,在 C 中当然也是如此。由于按位操作在 C 中很简单,因此很容易获得,并且通常是可取的,因为它是一种非常轻型实施。

更"modern"(冗长,and/or Bloaty McBloatface)的方法可能是在结构中使用位域:

struct sigaction {
  /* ... */
  struct {
    unsigned int sa_nocldstop : 1;
    unsigned int sa_nocldwait : 1;
    unsigned int sa_nodefer : 1;
    unsigned int sa_nostack : 1;
    unsigned int sa_siginfo : 1;
    /* ... */
  } sa_flags;
  /* ... */
};

这使得 struct sigaction 中的 sa_flags 成员本身是一个 struct,它由一堆 1 位宽的 unsigned int 成员组成。这通常会编译成完全相同的按位代码,但更清晰。

您可以通过显式设置来设置多个标志:

sa1.sa_flags.sa_nodefer = 1;
sa1.sa_flags.sa_siginfo = 1;

并且您需要一些其他方法来确保其余部分设置为 0。