• ベストアンサー

GTKでのOSのシグナルの使用

GTKでGTKのシグナルではなく、OSのシグナルを使いたいのですが、 gtk_main()が内部処理をしている間にシグナルを受信してしまうと、ディスプレイへの描画が停止し最終的にはプログラムが落ちます。 これをどうにかしたいのですが、いい方法はないでしょうか? 開発はCで行っています。 ちなみやりたいことは、 外部プロセスにて画像データを共有メモリに配置して、シグナルを受信した時にその共有メモリからデータを取得し、表示したいです。 現状では、平均で40秒ぐらいは動作しますが内部処理中にシグナルを受信すると止まってしまう様です。 ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

御存知でしょうが、sigaction() とか signal() のハンドラ内で安全に使えるシステムコールは一部のみです。まあ OS にも依るのですが、なので一般的にハンドラではフラグ立てするなどの最小限の処理に留め、実際の処理本体は安全はタイミングで実行するのがいいです。 あと案外ありえるのがハンドラ内で errno 壊してるとかいうケアレスミス。コードレビューしてても時々見掛けます。

helpaitm
質問者

お礼

解決に向かいつつあります。 ありがとうございました。

helpaitm
質問者

補足

ご回答ありがとうございます。 一度フラグ立てのみをハンドラに入れて、あとはアイドリングタイムに組み込んでみます。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

プログラムの構成が良くわかりませんので、的外れかもしれませんが、 1.gtk_main()の呼び出しの前に、今回のシグナルのマスクをする 2.gtk_main()の呼び出し 3.今回のシグナルのマスクの解除 4.今回のシグナルの処理 では、だめなのでしょうか。 上記のようにすることにより、 gtk_main()の実行中は、今回のシグナルを受けても、それをガードできます。

helpaitm
質問者

お礼

ご回答ありがとうございます。 gtk_main()中にシグナルを受けないようにしてしまうと意味がありません。 質問文読みにくくてすみません。

関連するQ&A