这就是我想要做的:
$ serverise normally-barely-interactive-program-that-uses stdin stdout &
unique-id-221B $ clienty 221B "Astonishing!"
Elementary
$ clienty 221B "what did I just say?"
'Astonishing', although the methods are simple and easily followed, once explained.
$ clienty 221B "so, you persist between invokations of the client?"
Indeed.
我尝试过双命名管道,但它们只能持续一次调用。我认为这是因为服务器端获得了EOF,因此假设用户已经关闭了stdin。
套接字似乎是可行的,但大多数包装器都采用类似http的模型,并在每次有人连接时派生出一个新程序。Socat看起来不错,但它也会在运行一次后就死掉。
我见过Gnu Screen和Tmux在这方面的使用,但这似乎有点夸张,说实话,我不能假设用户的环境不会包含这两个,因此任何像这样的解决方案在面对这些非标准配置时都会有点脆弱。这看起来也有点过头了。
这似乎是一个以前就会出现的问题,所以我一定是找错了地方,找错了能做到这一点的时髦的小工具。
发布于 2011-01-21 17:36:35
关于命名管道只持续一次调用的问题:如果这确实是您唯一的问题,那么它很容易解决。(我的示例几乎没有交互功能的程序恰好是bc
)
$ mkfifo in out
$ while read line <in; do echo "$line"; done | bc >out &
$ cat out &
$ echo "1+1" >in
2
$ echo "2+2" >in
4
它的工作方式是重新打开输入管道,一次只读一行,同时写入一个在整个会话中只打开一次的未命名管道。
请注意:
发布于 2011-01-21 16:51:15
在您描述的一般情况下,这是不可能的。
您所描述的东西看起来很像查询/回复服务,但只有stdin和stdout,您的勉强交互的程序无法提供一种方法来知道每个回复转到哪个查询。
在您的示例中,考虑您的第一个clienty
调用。显然,查询“令人惊讶”可以直接传输到服务器的标准输入,而且服务器似乎会在其标准输出上写上“基本”。但是,然后呢?包装器应该立即传输它吗?缓冲它?它如何知道答案是否完整?假设您已经解决了这个问题,如果同时有多个客户端在查询,它如何知道应该将答案发送回哪个客户端?
你需要最小数量的协议来解决这个问题。它可以像“回复是单行的、有保证的和有序的”一样简单。
https://stackoverflow.com/questions/4756552
复制相似问题