【问题标题】:How to set more than one flag in sigaction.sa_flags如何在 sigaction.sa_flags 中设置多个标志
【发布时间】:2016-06-01 11:59:41
【问题描述】:
我有以下结构:
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 一起使用?
【问题讨论】:
标签:
c
linux
process
signals
sigaction
【解决方案1】:
The manual page有答案:
它由以下零个或多个按位或组成:[...]
所以你会做类似的事情
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;
/* ... */
};
这使得struct sigaction 中的sa_flags 成员本身成为struct,它由一组1 位宽的unsigned int 成员组成。这通常会编译成完全相同的按位代码,但更清晰。
您可以通过显式设置来设置多个标志:
sa1.sa_flags.sa_nodefer = 1;
sa1.sa_flags.sa_siginfo = 1;
您需要其他方法来确保将其余部分设置为 0。