yarv-dev:769
From: Shiro Kawai <shiro lava.net>
Date: Wed, 04 Jan 2006 09:27:55 -1000 (HST)
Subject: [yarv-dev:769] Re: signal + blocking system call
From: SASADA Koichi <ko1 atdot.net> Subject: [yarv-dev:768] signal + blocking system call Date: Thu, 05 Jan 2006 00:30:05 +0900 > Gauche を参考に見せていただいていたんですが、 > > // gauche.h より > > #define SCM_SYSCALL3(result, expr, check) \ > do { \ ... (*) > (result) = (expr); \ > if ((check) && errno == EINTR) { \ > ScmVM *vm__ = Scm_VM(); \ > errno = 0; \ > SCM_SIGCHECK(vm__); \ > } else { \ > break; \ > } \ > } while (1) > > > こんな感じで、システムコールの後にシグナルのチェックをしていますが、 > (*) の段階でシグナルがきた場合(もちろん、出現頻度は低いとは思います > が)、(expr) で呼び出されるシステムコールはブロックしてしまい、最悪復帰 > しない可能性があるような気がします。 ここのコードは、「システムコールをブロックさせない」という 意図ではありません。システムコール中にシグナルが届いちゃった 場合を処理しているだけのコードです。 アプリケーション側のスタンスとしては、ブロックする可能性のある スレッドに重要なシグナルの処理をやらせるのがそもそも間違いである、 という考えです。確実にシグナルを受け取りたいなら、シグナルを 受けるスレッドをひとつ決めてsys-pauseで待つようにします (sys-pauseの実装は内部でsigsuspendを使っていて、このハザードを 避けています)。 なお、ここで問題にしているのはプロセスワイドの非同期シグナル だけです。pthread_killによるスレッド間のシグナル配送は 色々なハザードが多すぎて、一般的に使うべきメカニズムでは ありません。(そもそも、pthread_cond_waitで待っている時に シグナルを受けた場合、シグナルハンドル後に pthread_cond_waitが中断されるか再び待ちに入るかは 実装依存なんです。だから他のシステムコールでいくら工夫 しても無駄です)。 --shiro -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
768 2006-01-05 00:30 [ko1 atdot.net ] signal + blocking system call -> 769 2006-01-05 04:27 ┗[shiro lava.net ] 770 2006-01-05 08:29 ┗[ko1 atdot.net ] 771 2006-01-05 15:43 ┗[shiro lava.net ] 772 2006-01-06 18:14 ┗[ko1 atdot.net ]