【问题标题】:Command line tool to listen on several FIFOs at once一次监听多个 FIFO 的命令行工具
【发布时间】:2011-07-28 06:57:56
【问题描述】:

我正在寻找一种工具来一次读取多个 FIFO(可能使用select(2))并输出读取的内容,并在所有 FIFO 关闭时关闭流。更准确地说,program 的行为如下:

$ mkfifo a b
$ program a b > c &
$ echo 'A' > a
$ echo 'B' > b
[1]  + done       program a b > c
$ cat c
A
B
$ program a b > c &
$ echo 'B' > b
$ echo 'A' > a
[1]  + done       program a b > c
$ cat c
B
A

我的第一次尝试是使用cat,但第二个示例不起作用(echo 'B' > b 将挂起),因为cat 按顺序读取每个参数,而不是同时读取。在这种情况下使用什么工具正确?

【问题讨论】:

    标签: unix select fifo file-descriptor cat


    【解决方案1】:

    tail 会这样做。

    用途:

    tail -q -n +1 a b
    

    编辑:抱歉,这不起作用。我看看能不能找到别的东西。

    抱歉,我找不到任何东西。

    如果您不想自己编程,那么我的建议是多个命令:

    #!/bin/sh
    rm c
    cat a >> c &
    cat b >> c &
    wait
    

    您可能会遇到一些交错,但除此之外一切正常。等待是为了防止程序退出,直到所有的 cat 程序都完成(以防万一你有一些命令需要在一切完成后运行)。 rm 是为了确保 c 开始为空,因为 cat 命令附加到文件中。

    【讨论】:

    • 这太丑了,特别是因为我打算把它作为管道的一部分。 :-P 必须有一种优雅的方式。无论如何,感谢您的帮助!
    • 你可以自己编程;)实际上并不难做到。没有理由不能在管道中使用它顺便说一句,只需将其保存为 shell 脚本并在管道中调用它。
    • 把所有事情都做好是很难的,这就是为什么我希望有人已经完成了这项工作。至于在管道中使用它,如果我必须将管道的一部分作为单独的脚本编写,它就会失去很多魅力。 :-)
    猜你喜欢
    • 2023-04-06
    • 2021-01-27
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多