2

プログラムのシグナル処理を signal() から sigaction() に移行中です。

UNIX 仕様によると、astruct sigactionには少なくとも 4 つのメンバーが必要です。sa_handlersa_masksa_flagsおよびsa_sigaction

次のように構造を定義すると、すべてが正常に見えます。

...
#include <signal.h>
...
struct sigaction sa;

しかし、値を に割り当てようとするsa_handlerと、メンバーが存在しません。代わりに、次のように表示されます。 画像: sa_handler の代わりに __sigaction_handler : {sigaction.h:1092} を示しています

私は自分のsignal.handを調べましたbits/sigaction.h(ご参考までに、どちらにも 1092 行ありません)。何も問題はないようです。

私もこのメンバー名をそのまま使ってみましたが、コンパイラは

タイプ 'void (*)(int)' からタイプ 'union' に代入するときの比較できないタイプ

これにより、コンパイラ/IDE が構造の定義を処理する方法に何か問題があると思われますが、診断方法については私の頭の上にあります。

ヘルプや提案をいただければ幸いです。

システム情報:

  • デビアン 8
  • Linux 3.16.0-4-amd64
  • gcc 4.9.2 (デビアン 4.9.2-10)
  • 日食 CDT 3.8.1

更新 - 2016 年 8 月 3 日

これらの 2 つのスレッドherehereが見つかりました。これは、プリプロセッサ シンボル_POSIX_C_SOURCE_XOPEN_SOURCEそれぞれを定義することを提案しています。それぞれ (一度に 1 つずつ) を定義し、両方とも互換性のない型の問題を「修正」しました (値を sa.__sigaction_handler に正常に割り当てました)。しかし、それらは両方とも、タイプ intptr_t (スレッド関数管理に使用される) を使用する私のソフトウェアの機能を壊し、その理由で削除されました。

ただし、これを行うと問題は解決しました。コンパイラがエラーをスローすることなく、変数を sa.sa_handler に割り当てることができるようになりました。IDE ではまだ存在しないメンバーとして表示されますが (上記のリンクの画像と同じ)、これは小さな問題です。

4

2 に答える 2

0

には<sigaction.h>、次のものがあります#define

# define sa_sigaction   __sigaction_handler.sa_sigaction

この特定のエラーを修正したい場合は、コードに次の行を追加して問題を解決するか、直接アクセスすることができます。

sa.__sigaction_handler.sa_sigaction

ただし、これはシステム ヘッダーに深刻な問題があることを示していると感じています。<signal.h>があることを確認できます#include <bits/sigaction.h>か? sigaction.hそれがあることを確認できます#defineか?

于 2016-08-02T19:10:54.487 に答える