Переносимость sigaction и sigset_t между Solaris и Linux

У меня есть устаревший код на платформе 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;
}

Когда я пытаюсь скомпилировать в Linux с помощью gcc 4.9.2 (в Solaris компилируется нормально), я получаю следующую ошибку компиляции:

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

... и аналогично для __sigbits[1], __sigbits[2], __sigbits[3].

Есть ли аналог в Linux?


person Dr. Debasish Jana    schedule 11.04.2017    source источник
comment
Что вы пытаетесь сделать с __sigbits участником? Зачем ты его выводишь? Как вы уже поняли, префикс подчеркивания означает, что он зависит от реализации. Если вы все хотите это распечатать, просто не беспокойтесь о Linux.   -  person Roger Lipscombe    schedule 11.04.2017


Ответы (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");
}
person dbush    schedule 11.04.2017