【发布时间】:2021-02-20 17:12:21
【问题描述】:
当多个进程同时写入使用mkfifo 创建的同一个命名管道时,我遇到了并发问题,其中一些写入丢失了。由于写入进程的数量有限,我想从“从 n 个进程写入 1 个管道并从 1 个单独的读取”切换为“由 n 个进程写入 n 个管道并从 1 个单独的进程读取”。
目前我正在循环中通过read line <"$pipe" 阅读,直到满足条件。 read 在这里阻塞,直到读取一行。
如何通过一个循环从多个管道($pipe1、$pipe2 ... $pipeN)读取直到满足条件,同时尊重所有管道上新写入的行?
【问题讨论】:
-
您使用的符号
read line < "$pipe"在每次迭代时打开和关闭管道。当(唯一的)阅读器关闭管道时,所有内容都会丢失 - 这就是您丢失消息的原因。您需要更像while read line; do … done < "$pipe"的东西,它可以让管道保持打开状态,直到最后一个作者关闭它。使用命名管道很棘手。不管你是否使用命名管道,read命令上的 I/O 重定向通常是错误的——除非你真的确定你只需要一个输入。 -
我认为这可能是How to avoid
echoclosing FIFO named pipes — Funny behaviour of Unix FIFOs? 的副本,我认为问题的多个管道部分更多的是XY Problem,而不是您需要的。如果您确实需要从多个管道中读取数据,则需要一个 C 程序 — 使用select()或poll()或类似的东西来查找哪些管道实际上有数据要读取。 -
感谢您对最初问题的解释。事实上,这是一个 XY 问题。遗憾的是,您的提示并没有真正奏效。我针对最初的问题发布了question,并包含了切换到您的建议的结果。无论如何——即使它不能解决我最初的问题——我真的很想知道 this 帖子中描述的问题是否有解决方案?
-
请提供minimal reproducible example;不太清楚你在问什么。
标签: bash concurrency named-pipes mkfifo