如何在 busybox shell 脚本中以非阻塞模式刷新命名管道(FIFO)?
How to flush named pipe(FIFO) in non-blocking mode in busybox shell script?
我尝试使用 "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
注:
"dd" 命令在 Linux PC 终端中运行良好(不阻塞)在 'iflag' 的帮助下,例如,
dd if=tmp/fifo iflag=nonblock of=/dev/null
(!) 但这不适用于 busybox 的 dd
版本。如何使用 busybox
?
实现它
很容易检查 whether/how 这是可能的,只需查看 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 助手),这就是您所拥有的。
我尝试使用 "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
注:
"dd" 命令在 Linux PC 终端中运行良好(不阻塞)在 'iflag' 的帮助下,例如,
dd if=tmp/fifo iflag=nonblock of=/dev/null
(!) 但这不适用于 busybox 的 dd
版本。如何使用 busybox
?
很容易检查 whether/how 这是可能的,只需查看 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 助手),这就是您所拥有的。