siginfo_t
構造から子プロセスのPIDを取得する必要があります。このコードは、Solaris上で動作します:Solaris上で動作するコードを使用して、Linux上で `siginfo_t`からPIDを取得できません
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;
これは(signal.h
から)Solaris上siginfo_t
の定義です:
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の両方で動作しますので、説明してください。
2つのアンダースコアで始まる名前は実装用に予約されています。それだけで、アプリケーションのフィールドに触れないようにする指標になるはずです。 – Olaf