1

我有以下结构:

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 一起使用?

4

1 回答 1

3

手册页有答案:

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

所以你会做类似的事情

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本身成为 a struct,它由一堆 1 位宽的unsigned int成员组成。这通常会编译成完全相同的按位代码,但更清楚。

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

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

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

于 2016-06-01T12:05:14.143 回答