名前付きパイプを介して通信するシェルプログラムのペアがあります。リーダーは、開始時にパイプを作成し、終了時にパイプを削除します。
場合によっては、ライターは、リーダーが読み取りを停止してからパイプを削除するまでの間にパイプに書き込もうとします。
reader: while condition; do read data <$PIPE; do_stuff; done
writer: echo $data >>$PIPE
reader: rm $PIPE
これが発生すると、ライターは書き込み用のパイプを開こうとして永遠にハングします。
手動で強制終了するまでハングしたままにならないように、タイムアウトを設定するクリーンな方法はありますか?私は私ができることを知っています
#!/bin/sh
# timed_write <timeout> <file> <args>
# like "echo <args> >> <file>" with a timeout
TIMEOUT=$1
shift;
FILENAME=$1
shift;
PID=$$
(X=0; # don't do "sleep $TIMEOUT", the "kill %1" doesn't kill the sleep
while [ "$X" -lt "$TIMEOUT" ];
do sleep 1; X=$(expr $X + 1);
done; kill $PID) &
echo "$@" >>$FILENAME
kill %1
しかし、これはちょっと厄介です。これをよりクリーンに(Cコンパイラを壊さずに)行うためのシェルビルトインまたはコマンドはありますか?