Мне нужно получить PID дочернего процесса из структуры siginfo_t
. Этот код работает на Solaris:Не удается получить PID из `siginfo_t` в Linux, используя код, который работал на Solaris
siginfo_t *info;
//
// siginfo is initialized with proper data here
//
pid = info->__data.__proc.__pid;
Но когда я попытался перенести свой код на Linux, я получил ошибку компиляции:
error: ‘siginfo_t’ has no member named ‘__data’
pid = info->__data.__proc.__pid;
Это определение siginfo_t
на Solaris (от signal.h
):
typedef struct {
int si_signo;
int si_code;
int si_errno;
union {
int __pad[7];
struct {
pid_t __pid;
union {
struct {
uid_t __uid;
union sigval __value;
} __kill; /* si_code <= 0 SI_FROMUSER */
struct {
_CSTD clock_t __utime;
int __status; /* CLD_EXITED status, else signo */
_CSTD clock_t __stime;
} __chld; /* si_signo=SIGCHLD si_code=CLD_* */
} __pdata;
} __proc;
struct {
int __fltno;
void *__fltip;
void *__addr;
int __bdslot;
} __fault; /* si_signo=SIGSEGV,ILL,FPE,TRAP,BUS */
} __data;
} siginfo_t;
Однако Linux signal.h
имеет совершенно другое определение. Я не понимаю, как писать код, который использует siginfo_t
, но работает как на Linux, так и на Solaris, пожалуйста, объясните.
Имена, начинающиеся с двух символов подчеркивания, зарезервированы для реализации. Это само по себе должно быть индикатором, чтобы не касаться этих полей из вашего приложения. – Olaf