2017-01-30 7 views
1

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の両方で動作しますので、説明してください。

+0

2つのアンダースコアで始まる名前は実装用に予約されています。それだけで、アプリケーションのフィールドに触れないようにする指標になるはずです。 – Olaf

答えて

2

The official specification of siginfo_t(「siginfo_t」を検索する必要があります。フラグメントアンカーはありません)、表示されないあなたの引用した構造のが表示されません。これは、内部実装の詳細で、直接使用する必要はありません。

は(親指の一般的なルールとして、あなたが名前を2つのアンダースコアで始まるシステムヘッダ内 を直接使用することは想定されていません。)

を読むためにあなたのコードを変更し

pid = info->si_pid; 

であり、SolarisとLinuxの両方で正しく動作します。あなたはすでにそれを持っていない場合、また、各ソースファイルの最上部に

#define _POSIX_C_SOURCE 200809L 

または

#define _XOPEN_SOURCE 700 

のいずれかを追加して良いでしょう(それはすべての前に来る必要があります#includeまたはそれが機能しません)(どちらか一方を選択し、両方を選択しないで、XSIの機能が必要かどうかによって異なります)。現在のバージョンのSolarisとLinuxは、デフォルトで(ほぼ)このモードになりますが、明示的にアクティブにすると、特に古いシステムでは驚きを防ぐことができます。

siginfo_tには、その他の有用フィールドのすべてについて、si_で始まる名前があります。私がリンクしている仕様は普遍的なものをリストしています。あなたはOS固有のフィールドを使用する必要がある場合は、フォーム

#define si_pid __data.__proc.__pid 

si_名を使用するの#define秒間siginfo_tを見られるのと同じヘッダーに見えます。

+0

おかげで、試してみます。私が拾った情報はhttp://www.qnx.com/developers/docs/660/index.jsp?topic=%2Fcom.qnx.doc.neutrino.lib_ref%2Ftopic%2Fs%2Fsiginfo_t.html –

+0

ああghodからですそのドキュメントはひどいです。それを何のためにも信用しないでください。 – zwol

+1

@ girishs:QNXが作成したもの以外のものについては、そのサイトを信頼しないでください!とにかく、 '#include 'の前に '#define POSIX_C_SOURCE 200809L'を置いて、' siginfo_t'などを確実にしたいとします。GNU Cライブラリ(および亜種)で提供されています。このマクロは、Cライブラリ(ヘッダ)に、POSIX.1の機能(POSIX.1〜2008まで)を公開するように指示しています。 –

関連する問題