Shu*_*ump 17 unix named-pipes fifo eof
请考虑以下情形:
test
创建一个名为FIFO的FIFO .在一个终端窗口(A)中,我运行cat <test
并在另一个终端窗口(B)中运行cat >test
.现在可以在窗口B中写入并在窗口A中获得输出.也可以终止进程A并重新启动它,并且仍然可以使用此设置作为可疑的.但是,如果你在窗口B中终止进程,B将(据我所知)通过FIFO发送一个EOF来处理A并终止它.
实际上,如果您运行的进程不会终止于EOF,您仍然无法使用重定向到进程的FIFO.我认为这是因为这个FIFO被认为是封闭的.
反正有办法解决这个问题吗?
我遇到这个问题的原因是因为我想将命令发送到在屏幕会话中运行的我的Minecraft服务器.例如:echo "command" >FIFO_to_server
.这可以通过单独使用屏幕来实现,但我对屏幕不太满意我认为仅使用管道的解决方案将更简单,更清洁.
Gil*_*il' 29
A正在从文件中读取.当它到达文件的末尾时,它将停止读取.这是正常行为,即使该文件恰好是fifo.你现在有四种方法.
应用unix哲学.你有一个作家和读者不同意协议,所以你插入一个连接它们的工具.碰巧,unix工具箱中有这样一个工具:tail -f
.tail -f
即使在看到文件结束后仍继续读取其输入文件.让所有客户端与管道通信,并连接tail -f
到Minecraft服务器:
tail -n +1 -f client_pipe | minecraft_server &
Run Code Online (Sandbox Code Playgroud)正如jilles所提到的,使用一个技巧:管道支持多个编写器,并且只有在最后一个编写器消失时才会关闭.因此,请确保客户永远不会消失.
while true; do sleep 999999999; done >client_pipe &
Run Code Online (Sandbox Code Playgroud)问题是服务器基本上是为处理单个客户端而设计的.要处理多个客户端,您应该更改为使用套接字.将套接字视为"元数据管道":连接到套接字会创建一个管道,一旦客户端断开连接,该特定管道就会关闭,但服务器可以接受更多连接.这是一种干净的方法,因为如果两个客户端碰巧同时连接(使用管道,它们的命令可以散布),它还可以确保您不会混淆数据.但是,它需要更改minecraft服务器.
归档时间: |
|
查看次数: |
7744 次 |
最近记录: |