SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

signalについて

signalについて(後篇)

シグナル使用上の注意点と改良ポイント


8. 将来

 実は近い将来、シグナルをハンドルする仕組みが変わるようです。具体的にはシグナルをディスクリプタ経由で取得できるようになるらしいです。

 私が知る範囲では、下記のインタフェースがLinuxカーネル2.6.22-rc1で用意されたようです。

new interface
long signalfd( int ufd, sigset_t * user_mask, size_t sizemask );

 シグナルを通常の割り込み処理で補足するのではなく、ディスクリプタを経由してシグナルを受信するものなんだそうです。これによってディスクリプタに対してepoll(4)でPOLLINを待ったりselect(2)で待つことになります。しかし仕様上の不具合があったそうで、まだ混沌としている状況みたいです。

 何かわかりましたら、また当レポートに上げようと思います。

9. 結論

シグナルとはプログラムに対する内外からの割り込みを処理できる機能です
  1. SIGSEGVなどのいわゆる異常終了時、何処の関数で落ちたのか解析したり、復帰できる。
  2. SIGTERMなどの外部からの終了要求時、作業中の資源を整理し、例えばDBと接続してる場合はコネクションを切断した後終了する等、いわゆるクリーンアップ処理ができる。
  3. シグナルで参照・編集される可能性のあるデータに対しハンドラ外からデータを参照・編集する場合、シグナル処理を待たせる事ができる。
旧シグナルとPOSIXシグナルについて
  • 旧シグナルは環境依存な所がある。
  • 旧シグナルができる事は、POSIXシグナルで全て実現できる。
  • 汎用性・拡張性を考えて、POSIXシグナルで実装するべき。
シグナルハンドラ内で行ってよいのは下記のときです
  • ハンドラ内の自動変数の操作。
  • volatile修飾子の大域変数の操作。
  • 「非同期シグナルセーフ」関数の呼び出し。
上記以外の処理を行った場合、下記のような問題が発生する可能性があります
  • タイミングに依存する再現困難なデッドロックが発生する危険がある。
  • コンパイラによって意図しない最適化が行われ、プログラムが誤動作する危険がある。
シグナルと相性がよくないものは次のとおりです
  • pause(3)系関数、ただしerrno==EINTRを調べる事で対処可能。
  • スレッド、なるべく共存は避ける。
シグナルハンドラを廃止し、スレッドとsigwait/sigwaitinfoのあわせ技によって上記の問題を解消できます
  • スレッドを生成する前に補足対象のシグナルイベントをマスクする。
  • シグナルイベントを処理する専用スレッドを生成する。
  • そのスレッドがシグナルイベントを sigwait を使って見張る。
ただしその場合、スレッド独自の問題が発生します
  • スレッドセーフ関数を使用。
  • 同期対策を行う必要がある。

 以上です。

参考文献

  • 『詳解UNIXプログラミング』 W.リチャード スティーヴンス 著、大木 敦雄 訳、ピアソンエデュケーション、2000年12月

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
signalについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

(株)DTSに勤てます。WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。mixiもやってまして、こちらは子育てとか日々の日記メインです。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1591 2008/08/20 15:57

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー