In article <87psyqtpr3.fsf / m17n.org>,
  Tanaka Akira <akr / m17n.org> 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]