如何在busybox shell脚本中以非阻塞模式刷新命名管道(FIFO)?

时间:2015-08-17 18:37:23

标签: bash embedded-linux busybox

我尝试使用“cat”和“dd”命令刷新FIFO,两个命令都阻止了操作。

以下是用于刷新的命令,

创建FIFO

mkfifo tmp.fifo

使用“cat”命令

cat tmp.fifo 

甚至使用cat命令的文件描述符,如

exec 200<> tmp/fifo; 
cat <&200 > /dev/null

使用“dd”命令

dd if=tmp.fifo of=/dev/null

注意:

借助'iflag'之类的

“dd”命令在Linux PC终端中运行良好(不会阻塞),

dd if=tmp/fifo iflag=nonblock of=/dev/null

(!)但这不适用于busybox的dd版本。如何使用busybox实现它?

1 个答案:

答案 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帮助程序),它就是你所拥有的。