Solaris和Linux之间的sigaction和sigset_t的可移植性

时间:2017-04-11 12:22:37

标签: c linux signal-handling gcc4.9 sigaction

我在Solaris平台上有一些遗留代码,我想将它移植到Linux,但我在Linux上遇到了一些编译错误。 在Solaris上,我有以下代码片段:

#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上编译(在Solaris上编译好)时,我收到以下编译错误:

error: struct __sigset_t has no member named __sigbits
     << ", " << a.sa_mask.__sigbits[0]

...同样适用于__sigbits[1]__sigbits[2]__sigbits[3]

Linux中是否有相应的内容?

1 个答案:

答案 0 :(得分:1)

符合POSIX标准的方法是使用sigismember函数。

int i;
for (i=0; i<32; i++) {
    printf("signal %d masked: %s\n", i, sigismember(&a.sa_mask, i) ? "yes", "no");
}