我有一对通过命名管道进行通信的 shell 程序。阅读器在启动时创建管道,并在退出时将其删除。
有时,写入者会在读取器停止读取和移除管道之间尝试写入管道。
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
但这有点恶心。是否有内置的 shell 或命令可以更干净地执行此操作(不破坏 C 编译器)?