From: Tanaka Akira Date: 2005-02-25T11:42:11+09:00 Subject: [ruby-dev:25765] Re: I/O operation differs signal handler In article <87psyqtpr3.fsf@m17n.org>, Tanaka Akira writes: > [ruby-dev:25758] に書いたように、「SA_RESTART を一時的に抜くのはありか > もしれませんが毎回やるのはオーバーヘッドが気になり、さりとてずっとそう > しておくのは他のライブラリの迷惑になります」という認識です。 そうそう、SA_RESTART を止めるという方法は race condition が残ります。 (1) read/write が起動する前 (2) read/write の起動中、まだデータが転送されていないとき (3) read/write の起動中、1byte 以上データが転送されたとき (4) read/write が終了した後 という中で、(1) で signal が来て flag を立てると、signal handler から 出た後に read/write が起動して、ブロックする可能性があります。 なお、race condition があるというのは事前に select するのも同じですが、 select と read で race condition が問題になるのはその間で signal が到 着するだけでなくさらにその間で他のプロセスが勝手に read するという条件 が必要なので、SA_RESTART 無しにくらべて良い性質を持っています。 まぁ、race condition を除去するには nonblocking I/O とか sigsafe が必 要になるので、(デフォルトでは) ある程度の race condition は許容するほ うが全体的には幸せだと思うのですが、signal の扱いだけを考えれば select かなぁ。 -- [田中 哲][たなか あきら][Tanaka Akira]