インタラプト

やっぱり実装すべきかと考え中。
実装するとすると、ブロックする呼び出しを行った後、例えばpards_is_interrupted()のようなグローバルな関数を呼び出して、インタラプトされたかどうかチェックすることになりそう。
ところで、今タイムアウト付きのread()とかは、timedread(struct timeval tv, int *is_timedout)のような形で呼び出すことにしています。つまり、タイムアウトしたかどうかは、引数に与えたintへのポインタが指す内容が1か0かで判断する、というAPIになっています。
これをpards_is_timedout()のようなグローバルな関数にすべきか、ということも考えたのですが、こちらはこのままの方がよさそうです。
というのは、timeout付きのメンバ関数は何度も呼ばれる可能性がありますが、グローバル関数でチェックすることにすると、次の呼び出しの前にチェックしないと、タイムアウトしたという情報が失われてしまいます。まぁ、これでもいいのですが、「(readで)タイムアウトした場合、返り値は意味が無い」ということを意識するためにも、引数にフラグを渡す方が好ましいと思われます。
それに対してインタラプトの方は、一度インタラプトされると、その情報はクリアされません(という仕様で良いと思う)。また、普通のread()などのAPIを変えたくは無いので、グローバル関数でチェックすることが好ましそうです。

というわけで、タイムアウトとインタラプトはAPIが異なることになりそうです。

そうそう、インタラプトの実装の際は、write()の時に排他制御するロックの中でもインタラプトされる可能性があることに注意して実装しないと。そもそも、排他制御のためのlockとブロックする可能性があるlockは関数を分けた方がいいかもなぁ。