gpt4 book ai didi

linux - 带 I/O 重定向的管道停顿

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:00 27 4
gpt4 key购买 nike

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

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

  1. 为请求的重定向创建适当的管道。
  2. 启动一个新进程来处理命令。
  3. 将输入数据写入标准输入管道。
  4. 从 stdout 管道读取,然后从 stderr 管道读取。

当有大量数据写入输入管道以及大量输出数据时,我们会遇到停顿问题。如果在写入 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

最佳答案

好像是python documents a similar type of deadlock在其文档中。好像python's source code (参见第 900 行和 _communicate)通过创建多个读取器守护线程来处理这个问题,当 communicate 方法被调用。

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

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

关于linux - 带 I/O 重定向的管道停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49805783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com