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

以下是用于刷新的命令,

创建先进先出

mkfifo tmp.fifo

使用“猫”命令
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 实现它?

最佳答案

很容易检查这是否/如何可能,只需查看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"

这是一种丑陋、低效且有问题的可移植性 hack —— 但没有添加额外的依赖项(Python、Perl、一个小 C 助手),这就是你所拥有的。

关于bash - 如何在busybox shell脚本中以非阻塞模式刷新命名管道(FIFO)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32057396/

10-10 17:40