У меня есть пара программ оболочки, которые общаются по именованному каналу. Считыватель создает канал при его запуске и удаляет его при выходе.
Иногда писатель пытается выполнить запись в канал между временем, когда считыватель прекращает чтение, и временем, когда он удаляет канал.
reader: while condition; do read data <$PIPE; do_stuff; done
writer: echo $data >>$PIPE
reader: rm $PIPE
когда это произойдет, писатель будет висеть навсегда, пытаясь открыть канал для записи.
Есть ли clean способ дать ему тайм-аут, чтобы он не зависал до тех пор, пока его не убьют вручную? Я знаю, что могу сделать
#!/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)?