我尝试使用“cat”和“dd”命令刷新FIFO,两个命令都阻止了操作。
以下是用于刷新的命令,
mkfifo tmp.fifo
cat tmp.fifo
甚至使用cat命令的文件描述符,如
exec 200<> tmp/fifo;
cat <&200 > /dev/null
dd if=tmp.fifo of=/dev/null
“dd”命令在Linux PC终端中运行良好(不会阻塞),
dd if=tmp/fifo iflag=nonblock of=/dev/null
(!)但这不适用于busybox的dd
版本。如何使用busybox
实现它?
答案 0 :(得分:4)
只需查看busybox来源,即可轻松检查是否可行/如何实现:No references to O_NONBLOCK
exist anywhere in the busybox codebase.
因此:仅使用busybox,这是不可能的。
现在,可以做什么(如果你的内核的行为是合适的 - POSIX没有在这种模式下指定命名管道的行为,保留实现定义)是用O_RW
打开管道(所以它不需要编写器)并执行阻塞读取,另一个进程在超时后终止它:
exec 5<>yourpipe
cat <&5 >/dev/null & cat_pid=$!
sleep 1
kill "$cat_pid"
这是一个丑陋,低效且可疑的可移植黑客 - 但如果不添加额外的依赖项(Python,Perl,一个小C帮助程序),它就是你所拥有的。