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

时间:2016-06-01 11:59:41

标签: c linux process signals sigaction

我有以下结构:

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?

1 个答案:

答案 0 :(得分:2)

The manual page有答案:

  

它由以下零个或多个的按位OR形成:[...]

所以你会做类似

的事情
sa1.sa_flags = SA_NODEFER | SA_SIGINFO;

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

更“现代”(详细和/或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;
  /* ... */
};

这使得sa_flags中的struct sigaction成员本身成为struct,其中包含一堆1位宽的unsigned int成员。这通常会编译成完全相同的按位代码,但更清楚。

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

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

你需要一些其他的方法来确保其余的设置为0。