【问题标题】:Redirect standard input/output between threads在线程之间重定向标准输入/输出
【发布时间】:2018-07-23 09:07:23
【问题描述】:

我正在创建一个需要通过标准输入(发送命令)与 C++ 引擎通信并读取其标准输出(读取引擎响应)的 GUI。我在 iOS 环境中执行此操作,因此我无法分叉进程并在它们之间进行通信,但我可以创建我认为应该可以正常工作的新线程。

我查看了与此类似的其他问题,但它们主要通过fork() 使用进程分叉,我无法使用。处理线程时是否有类似的方法?

C++ 中有什么东西可以通过标准输入/输出促进线程间通信吗?还是应该研究 C 函数(例如 pthread_createdup2)?

编辑:有人指出我的问题是XY问题,所以为了更清楚地说明源问题:C++引擎是一个国际象棋游戏引擎,通常通过命令行界面运行。您可以通过 CLI 中的标准输入与它进行交互(即输入移动)。我将它打包在一个无法做到这一点(没有分叉或终端访问)的 iOS 应用程序中,所以我试图以编程方式模拟标准输入到引擎的主循环,它通过标准输入侦听用户输入。

【问题讨论】:

  • “通过标准输入/输出促进线程间通信?” 您为什么要这样做?线程之间有更好的通信方式。
  • @TheDude c++ 引擎正在通过标准输入侦听输入,因为您通常通过命令行与之交互,但我不能在 iOS 环境中这样做。
  • 这和线程有什么关系?
  • @TheDude 我想在单独的线程中运行引擎,这样我就可以按照this recommendation 模拟标准输入。引擎循环运行,所以我需要将它与主 UI 线程分开
  • Sounds like an XY problem。你想做什么? C++ 引擎是干什么用的?听起来您是在询问您尝试的解决方案,而不是您的实际问题。

标签: c++ c multithreading pthreads


【解决方案1】:

一种将标准输入/标准输出重定向到管道的老式 Unix 方法是:

close(0);
close(1);
int io[2];
if(pipe(io))
   perror("ERROR, blah blah");

解释:

Unix 操作系统承诺将新的文件描述符附加到可用的最低可用文件描述符(这是一个从索引 0 开始到进程分配的最大大小的数组)。

通过关闭标准输入(0)和标准输出(1),这些文件描述符变得可用。

通过打开管道,这些文件描述符(0 和 1)被附加到新管道。

任何引用这两个文件描述符的东西现在都引用了新管道。

【讨论】:

  • 有趣,那么这是否绕过了对任何类型的线程间通信的需求?如果我理解正确,我想重定向标准输入的线程只需要读取一次 io 的 read fd 端(就像普通管道一样?)所以主线程可以 printf 标准输出然后另一个线程会从 io 管道中读取它
  • @swigganicks 是的。我认为在容纳非阻塞 IO 或更大的有效负载时可能会调整一般规则(因为管道对其缓冲区有限制,因此可能会发出信号或轮询 read),但一般规则是管道 进程间(或线程间)通信。不需要其他任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2012-05-11
  • 1970-01-01
相关资源
最近更新 更多