1

这就是我想要做的:

$ 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,因此假设标准输入已被用户关闭。

套接字似乎是要走的路,但大多数包装器都采用类似 http 的模型,并且每次有人连接时都会派生一个新程序。socat 看起来还可以,但它也只是一口气就死了。

我已经看到用于此的 Gnu Screen 和 Tmux,但这似乎有点矫枉过正,老实说,我不能假设用户的环境不会包含任何一个,因此任何像这样的解决方案在脸上都会有点脆弱那些的非标准配置。这似乎也有点矫枉过正。

这似乎是一个以前会出现的问题,所以我必须在错误的地方寻找执行此操作的时髦的小实用程序。

4

2 回答 2

0

关于命名管道仅持续一次调用的问题:如果这确实是您唯一的问题,那么它很容易解决。(我的示例几乎没有交互式程序恰好是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-21T09:36:35.330 回答
0

在您描述的一般情况下,这是不可能的。

你描述的东西看起来很像一个查询/回复服务,但只有标准输入和标准输出,你的几乎不交互的程序没有提供一种方法来知道每个回复去哪个查询。

在您的示例中,考虑您的第一次clienty调用。显然,查询“Astonishing”可以直接传输到服务器的标准输入,并且似乎服务器会在其标准输出上写入“基本”。但那又如何呢?包装器应该立即转移吗?缓冲吗?它如何知道答案是否完整?假设您已经解决了这个问题,如果多个客户端同时查询,它如何知道将答案发回给哪一个?

你需要最少数量的协议来解决这个问题。它可以像“回复是单行的、有保证的和有序的”一样简单。

于 2011-01-21T08:51:14.927 回答