我知道我可以在条件变为现实的情况下通过执行以下操作:
while true; do
test_condition && break
sleep 1
done
但是它在每次迭代(休眠)时都会创建1个子流程。我可以这样做来避免它们:
while true; do
test_condition && break
done
但是它占用大量CPU(繁忙等待)。为了避免子流程和繁忙的等待,我想出了以下解决方案,但是我发现它很丑陋:
my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by read.
exec 3<> $my_tmp_dir/fifo # Open the fifo for reading and writing.
while true; do
test_condition && break
read -t 1 -u 3 var # Same as sleep 1, but without sub-process.
done
exec 3<&- # Closing the fifo.
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap.
注意:在一般情况下,我不能在没有read -t 1 var
fifo的情况下简单地使用它,因为它会消耗stdin,如果stdin不是终端或管道,它将不起作用。
我可以以更优雅的方式避免子流程和繁忙的等待吗?
true
,问题已更新。
read -t 1 var
。
sleep
像第一个示例中那样使用。第二种方法虽然可行,但将来任何人都很难调整。简单的代码也具有更大的安全潜力。
true
是内置的,不会在bash中创建子进程。繁忙的等待永远都是不好的。