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

标签 bash embedded-linux busybox

我尝试使用“cat”和“dd”命令刷新 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 实现它?

最佳答案

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

相关文章:

c - 防止 Ubuntu 12 中缓冲区溢出演示中的段错误

ruby - Make Coderay (in Pry) 高亮评论

java - Bash:迭代更改文件中的一行并将 file.txt 读取到程序

c++ - 在 OpenGL ES 2 应用程序/进程之间共享渲染表面(FrameBuffer、Pbuffers 等)

linux - 如何让Buildroot嵌入式linux文件系统持久化?

bash - 使用 GIMP 的命令行转换 XCF 和其他文件?

Linux 网络驱动程序端口到 ARM

c - 配置脚本的问题

android - 在 Android 上运行 Debian 的静态 busybox 时出现错误的系统调用

linux - Shell:在带有换行符的变量上使用 grep