防止FIFO关闭/重用已关闭的FIFO

| 请考虑以下情形: 创建一个名为“ 0”的FIFO。在一个终端窗口(A)中运行
cat <test
,在另一个终端窗口(B)中运行2ѭ。现在可以在窗口B中写入并在窗口A中获得输出。还可以终止进程A并重新启动它,并且仍然可以根据需要使用此设置。但是,如果您在窗口B中终止该进程,据我所知,B将通过FIFO发送一个EOF到进程A,并且也终止该进程。 实际上,如果您运行的进程不会在EOF上终止,则仍然无法使用重定向到该进程的FIFO。我认为这是因为该FIFO被视为已关闭。 反正有解决此问题的方法吗? 之所以遇到这个问题,是因为我想将命令发送到在屏幕会话中运行的Minecraft服务器。例如:
echo \"command\" >FIFO_to_server
。通过单独使用屏幕可能可以做到这一点,但是我对屏幕不是很满意,我认为仅使用管道的解决方案会更简单,更清洁。     
已邀请:
A正在从文件读取。当到达文件末尾时,它将停止读取。即使文件碰巧是fifo,这也是正常现象。您现在有四种方法。 更改阅读器的代码,以使其在文件结束后继续阅读。这就是说输入文件是无限的,到达文件末尾只是一种幻想。对您而言不切实际,因为您必须更改Minecraft服务器代码。 应用Unix哲学。您有一个不同意协议的作者和一个读者,因此您插入了一个将它们连接起来的工具。碰巧,unix工具箱中有一个这样的工具:
tail -f
tail -f
即使看到输入文件的末尾,仍继续从其输入文件读取数据。让您的所有客户与管道交谈,然后将
tail -f
连接到我的世界服务器:
tail -n +1 -f client_pipe | minecraft_server &
正如jilles所提到的,使用一个技巧:管道支持多个编写器,并且仅在最后一个编写器消失时才关闭。因此,请确保有一个永远不会消失的客户。
while true; do sleep 999999999; done >client_pipe &
问题是服务器从根本上设计为可以处理单个客户端。要处理多个客户端,应更改为使用套接字。将套接字视为“元管道”:连接到套接字会创建管道,一旦客户端断开连接,该特定管道就会关闭,但是服务器可以接受更多连接。这是干净的方法,因为如果两个客户端碰巧同时连接(使用管道,它们的命令可以散布),它还可以确保您不会混淆数据。但是,这需要更改Minecraft服务器。     
启动一个过程,使fifo保持打开状态以进行写入并无限期地运行。这将防止读者看到文件结束条件。     
您可以在管道中添加多个输入,方法是在\'mkfifo yourpipe \'中用分号添加括号中的内容:
(cat file1; cat file2; ls -l;) > yourpipe
    

要回复问题请先登录注册