[Gauche-devel] =?iso-2022-jp?b?c2lnd2FpdBskQiROJTUlXSE8JUgbKEI=?=
R7RS Scheme scripting engine
Status: Beta
Brought to you by:
shirok
|
From: Rui U. <ru...@gm...> - 2007-01-09 09:00:54
|
Lingrででている話題ですが、説明のためにこちらにもメールしておきます。
sigwaitをサポートするパッチを作成しました。
#include <signal.h>
int sigwait(const sigset_t *restrict set, int *restrict sig);
sigwaitは、setで指定されるシグナルを解除して、そのブロックされていた
シグナルの1つをsigにセットして返す関数です。
sigwaitを使うシグナルハンドリングは、マルチスレッドなプログラムから
最も簡単にシグナルを扱う方法のようです。パッチが提供するsys-sigwait
を使うと、マルチスレッドなSchemeアプリケーションで次の方法でシグナル
を処理できます。
(1) すべてのスレッドで、ハンドルしたいシグナルをブロックしておく
(2) シグナルをハンドルするスレッドでsys-sigwaitを呼んで、シグナル
到着を待つ。シグナルが到着すると、sys-sigwaitの返り値として
シグナル番号が返る。
(3) 返り値でディスパッチしてシグナルを処理する。
シグナルハンドラを書く必要がなく、意図したところ以外でシグナルハン
ドラが割り込むこともないので、シグナルを扱うのが簡単ということのよう
です。
sys-pauseでシグナルを待つことで、sigwaitと似たようなことはできますが、
シグナルハンドラを設定するのがやや面倒であることと、シグナルハンドラ
実行中にシグナルをブロックしておかなければ割り込まれてしまうことが
あることに注意しなければいけません。その点、sys-sigwaitのほうが簡単
です。
-- 植山 類
|