Solaris和Linux之间sigaction和sigset_t的可移植性
问题描述:
我在Solaris平台上有一些遗留代码,我想将它移植到Linux,但是我在Linux上遇到了一些编译错误。 在Solaris上,我有下面的代码片段:Solaris和Linux之间sigaction和sigset_t的可移植性
#include <signal.h>
...
void f() {
struct sigaction a;
sigaction(sig,0,&a);
std::cout << (void *) a.sa_handler
<< ", " << (void *) a.sa_sigaction
<< ", " << a.sa_mask.__sigbits[0]
<< ", " << a.sa_mask.__sigbits[1]
<< ", " << a.sa_mask.__sigbits[2]
<< ", " << a.sa_mask.__sigbits[3]
<< ", " << (void *) a.sa_flags
<< std::endl;
}
当我尝试使用gcc 4.9.2在Linux上编译(编译OK在Solaris上),我得到以下编译错误:
error: struct __sigset_t has no member named __sigbits
<< ", " << a.sa_mask.__sigbits[0]
...和类似的__sigbits[1]
,__sigbits[2]
,__sigbits[3]
。
Linux中是否有等价物?
答
符合POSIX标准的方法是使用sigismember
函数。
int i;
for (i=0; i<32; i++) {
printf("signal %d masked: %s\n", i, sigismember(&a.sa_mask, i) ? "yes", "no");
}
你想用'__sigbits'成员做什么?你为什么要输出它?下划线前缀意味着它是依赖于实现的,就像你发现的那样。如果所有你想要做的就是打印它,那么不要在Linux上打扰。 –