タグ

!tumblr-techとsignalに関するtyruのブックマーク (3)

  • シグナルの誕生 - Plan9日記

    今日はシグナルの歴史を調べてみたいと思う。シグナルというのはUNIXにおけるプロセス間通信の一手段であるが、CPUにおける例外のように、プロセスにとって非同期に発生するものなので、その実装はいろいろ面倒くさい。したがっていろいろ問題もあり、長年の改良の歴史を経て、今のシグナルの仕様に落ち着いた*1。BSDやSVR、そしてPOSIX標準になるまでのシグナルの拡張については文献が多いが、V6/V7以前は知られていないのでは。ということで、私の出番w まぁ、わかったところで喜ぶのは相当な好事家だろうが*2。 いきなりV7以前の話を始めるのも何なので、前提知識として、FreeBSD版悪魔「4.7.1 シグナルの歴史」からちょっと長いけど引用する。 シグナルは、ユーザが暴走したプログラムを強制終了する場合など、例外的なイベントをモデルとして当初設計された。それは、汎用のプロセス間通信として使われる

    シグナルの誕生 - Plan9日記
  • Wait the end of prog1 and launch prog2 Using sleep

  • memologue - UNIX上でのC++ソフトウェア設計の定石 (2)

    鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正

    memologue - UNIX上でのC++ソフトウェア設計の定石 (2)
  • 1