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中是否有等价物?

+2

你想用'__sigbits'成员做什么?你为什么要输出它?下划线前缀意味着它是依赖于实现的,就像你发现的那样。如果所有你想要做的就是打印它,那么不要在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"); 
}