【问题标题】:How to flush named pipe(FIFO) in non-blocking mode in busybox shell script?如何在busybox shell脚本中以非阻塞模式刷新命名管道(FIFO)?
【发布时间】:2015-08-17 18:37:23
【问题描述】:

我尝试使用“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

注意:

“dd”命令在 'iflag' 之类的帮助下在 Linux PC 终端中运行良好(不会阻塞),

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

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

【问题讨论】:

    标签: bash embedded-linux busybox


    【解决方案1】:

    只需查看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 帮助程序),这就是你所拥有的。

    【讨论】:

    • “busybox 代码库中的任何地方都不存在对 O_NONBLOCK 的引用。”。出于某种原因,我觉得这个事实很有趣。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2010-10-09
    • 2013-11-04
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多