【问题标题】:Can't write to named pipe无法写入命名管道
【发布时间】:2013-02-28 20:54:34
【问题描述】:

我正在尝试写入使用 mkfifo 制作的命名管道。但是当我运行命令时,(例如)ls > myNamedPipe,我不能再在 bash 中输入命令。我仍然可以写字符,仅此而已。

【问题讨论】:

    标签: linux bash named-pipes


    【解决方案1】:

    命名管道保持打开状态,直到您从其他地方读取它。这是为了允许不同进程之间的通信。

    试试:

    mkfifo fifo
    echo "foo" > fifo
    

    然后打开另一个终端并输入:

    cat fifo
    

    如果您返回第一个终端,您会注意到您现在可以输入其他命令。

    另请参阅反向发生的情况:

    # terminal 1
    cat fifo
    
    # terminal 2
    echo "foo" > fifo
    
    # and now you can see "foo" on terminal 1
    

    如果您希望终端在尝试向 fifo 写入内容时不要“挂起”,请在 fifo 上附加一个文件描述符:

    mkfifo fifo
    exec 3<> fifo
    echo "foo" > fifo
    echo "bar" > fifo
    

    【讨论】:

    • 谢谢 - 这很好用!不过,你能解释一下为什么吗?我不太明白exec 3&lt;&gt; fifo 行是如何解决问题的……
    • 将fifo附加到文件描述符会导致shell缓冲写入fifo的数据。没有它,任何对 fifo 的写入都会阻塞,直到有东西读取写入的内容。使用文件描述符,“foo”和“bar”由 shell 缓冲,从该文件描述符读取的任何内容都可以在以后读取它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2015-05-31
    • 2013-01-22
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多