【问题标题】:'read' not timing out when reading from pipe in bash从 bash 中的管道读取时,“读取”没有超时
【发布时间】:2011-06-23 02:14:35
【问题描述】:

我使用

创建了一个管道
mkfifo /tmp/foo.pipe

现在,我想尝试从管道读取最多 2 秒,所以我执行

read -t 2 line < /tmp/foo.pipe

没有发生超时。 Read 只是坐在那里等待来自管道的输入。

手册说“读取”应该与命名管道一起使用。有谁知道为什么会这样?

ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果您通过单击最佳答案旁边的绿色复选标记(如果有)接受了问题的答案,那么人们更有可能回答您的问题。

标签: bash timeout


【解决方案1】:

在调用 read 内置函数之前,您的 shell 阻塞了 open() 调用。

在Linux上,您可以同时打开FIFO进行读写,以防止打开时阻塞;这是不可移植的,但可以做你想做的。

read -t 2 <>/tmp/foo.pipe

改编自:Bash script with non-blocking read

【讨论】:

    【解决方案2】:

    如果您只想从 FIFO 中刷新(并丢弃)数据:

    dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null
    

    【讨论】:

      【解决方案3】:

      您的 shell 正在阻止它,它正在尝试从管道中读取数据以将数据输入到读取命令中,并且由于它没有得到任何东西,它只是坐在那里等待。

      【讨论】:

        【解决方案4】:
        TMOUT=2
        read line < /tmp/foo.pipe
        

        【讨论】:

        • 这只是设置了默认超时,并没有改变read实际实现超时的方式。
        猜你喜欢
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 2016-02-02
        相关资源
        最近更新 更多