Переносимость 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?
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");
}