您的问题
if如下:
while truedo if read txt <"$pipe" ....done
发生的情况是您的作业队列服务器每次在循环中都在打开和关闭管道。这意味着某些客户端在尝试写入管道时会遇到“管道中断”错误-
也就是说,管道的读取器在编写器打开后消失了。
要解决此问题,请在服务器中更改循环,为整个循环打开一次管道:
while truedo if read txt ....done < "$pipe"
这样,管道将打开一次并保持打开状态。
您将需要注意在循环中运行的内容,因为循环中的所有处理会将stdin附加到命名管道。您将要确保将循环中所有进程的stdin从其他位置重定向,否则它们可能会消耗管道中的数据。
编辑:现在的问题是,当最后一个客户端关闭管道时,读取时会出现EOF,您可以使用jilles方法复制文件描述符,或者可以确保自己也是客户端并保持写方打开的管道:
while truedo if read txt ....done < "$pipe" 3> "$pipe"
这将使管道的写端在fd
3上保持打开状态。与stdin一样,此文件描述符也适用相同的警告。您将需要关闭它,以便任何子进程都不继承它。它的重要性可能不如stdin,但它会更干净。



