带有I / O重定向的管道档位

时间:2018-04-12 20:59:58

标签: linux windows pipe rexx

我们正在尝试为ooRexx编程语言添加一项功能,允许程序员在stdin,stdout和stderr流上发出带有I / O重定向选项的操作系统命令。我们为Windows和所有基于unix的系统提供此服务。

我们有两种环境的设置,设置大致相同:

  1. 为请求的重定向创建适当的管道。
  2. 启动一个新进程来处理该命令。
  3. 将输入数据写入stdin管道。
  4. 从stdout管道读取,然后从stderr管道读取。
  5. 当有大量数据写入输入管道并且还有大量输出数据时,我们遇到了停顿问题。如果,在写入stdin并且管道已满时,我们会被阻止。但是,如果启动的进程也设法填满输出管道,它也会阻塞。结果,整个管道停转,一切都挂起。我们的代码一直试图写入输入管道,直到从中读取一些数据。在尝试写入输出管道之前,该过程一直处于停滞状态,直到读取某些数据为止,由于对输入的写入被停止,因此不会发生这种情况。一个经典致命的拥抱。

    我已经在Windows和Linux上研究了很多不同的非阻塞I / O选项,但到目前为止,还没有找到任何不会导致其他问题的选项,例如数据丢失。有没有人对如何管理这个有什么建议?

    对于感兴趣的人,这里有一个链接到处理Windows结尾的代码:

    https://sourceforge.net/p/oorexx/code-0/HEAD/tree/sandbox/rick/addresswith/interpreter/platform/windows/SystemCommands.cpp

    这是Linux版本

    https://sourceforge.net/p/oorexx/code-0/HEAD/tree/sandbox/rick/addresswith/interpreter/platform/unix/SystemCommands.cpp

1 个答案:

答案 0 :(得分:0)

在其文档中似乎是python documents a similar type of deadlock。似乎python's source code(参见第900行和_communicate)通过创建多个读取器守护程序线程来处理此问题,该线程在输入管道时从输出管道读取调用communicate方法。

虽然这种类型的构造是为更高级别的语言(Python)完成的,但我认为创建读取输出管道的线程,同时写入主程序中的输入管道将是一个很好的方法。虽然,我没有真正使用C ++ / C中的线程,所以在使用线程时我无法保证其效率或任何可能的陷阱。

我可能会看到使用多个线程(一如既往)的问题是您必须确保通过放置适当的同步代码来解释任何可能的数据争用。