【发布时间】:2018-04-12 20:59:57
【问题描述】:
我们正在尝试向 ooRexx 编程语言添加一项功能,该功能允许程序员使用标准输入、标准输出和标准错误流上的 I/O 重定向选项发出操作系统命令。我们对 Windows 和所有基于 unix 的系统都这样做。
我们有两种环境的设置,并且设置大致相同:
- 为请求的重定向创建适当的管道。
- 启动一个新进程来处理该命令。
- 将输入数据写入标准输入管道。
- 从 stdout 管道读取,然后从 stderr 管道读取。
当有大量数据写入输入管道以及大量输出数据时,我们会遇到停顿问题。如果在写入标准输入时管道已满,我们就会被阻塞。但是,如果启动的进程也设法填满输出管道,它也会阻塞。结果,整个管道停止,一切都挂起。我们的代码一直试图写入输入管道,直到从中读取一些数据。该进程一直试图写入输出管道,直到读取了一些数据,这不会发生,因为对输入的写入已停止。经典的致命拥抱。
我在 Windows 和 Linux 上研究了许多用于非阻塞 I/O 的不同选项,但到目前为止,还没有发现任何不会导致其他问题的方法,例如丢失数据。有人对如何管理有任何建议吗?
对于感兴趣的,这里是处理Windows端的代码的链接:
这是Linux版本
【问题讨论】:
-
你为什么要标记这个 rexx