【问题标题】:Portability of sigaction and sigset_t between Solaris and Linuxsigaction 和 sigset_t 在 Solaris 和 Linux 之间的可移植性
【发布时间】:2017-04-11 12:22:37
【问题描述】:

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

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

【问题讨论】:

  • 你想对__sigbits 成员做什么?你为什么输出它?正如您所发现的,下划线前缀意味着它依赖于实现。如果所有您只想打印它,那就别在 Linux 上费心了。

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


【解决方案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");
}

【讨论】: