unix – 防止FIFO关闭/重用封闭FIFO

考虑以下情况:

创建一个名为test的FIFO。在一个终端窗口(A)中,我运行cat< test和另一个(B)cat>测试。现在可以在窗口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连接到minecraft服务器:

tail -n +1 -f client_pipe | minecraft_server &

> As mentioned by jilles,使用诀窍:管道支持多个作家,只有最后一个作家离开时才会关闭。所以确保有一个客户永远不会消失。

while true; do sleep 999999999; done >client_pipe &

>问题是服务器基本上是为了处理单个客户端而设计的。要处理多个客户端,您应该更改为使用套接字。将套接字视为“元管道”:连接到套接字创建一个管道,一旦客户端断开连接,该特定管道将被关闭,但服务器可以接受更多的连接。这是一个干净的方法,因为它还可以确保如果两个客户端在同一时间发生连接,则不会混淆数据(使用管道,它们的命令可以散置在其中)。但是,它需要更改minecraft服务器。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...