3

我有我的 C++ 程序,它分叉成两个进程,1(原始)和 2(分叉进程)。

在分叉的进程 (2) 中,它执行执行大量计算的程序 A。

原始进程 (1) 通过重定向到管道的标准输入和输出与该程序 A 通信。

我正在尝试在原始进程 (1) 中向我的代码添加 websocket 连接。我希望我的原始进程能够有效地选择或 epoll 是否有数据要从管道读取到程序 A,或者是否有数据要从 websocket 连接读取。

鉴于野兽 websocket 不是文件描述符,我该如何实现 select 或 epoll 的效果?

4

2 回答 2

3

您使用的是哪个版本的 Boost?如果它是相对较新的,它应该包括对boost::process::async_pipe的支持,它允许您使用除套接字之外的 I/O 对象与 Asio 异步。boost::process 库的教程中提供了示例。由于Beast 使用 Asio 库在后台执行 I/O,因此您可以很容易地将两者结合起来。

鉴于野兽 websocket 不是文件描述符......

Beast WebSocket 不是文件描述符,但它确实使用 TCP 套接字来执行 I/O(参见上面的链接示例),并且 Asio 非常擅长将 select/epoll 与 TCP 套接字一起使用。只要确保您像往常一样执行async_read,async_write和操作即可。io_service::run

于 2017-10-17T05:28:29.573 回答
1

您可以对代码进行少量更改。用两个替换管道Message Queue。例如 out_qresponse_q。现在,您的子进程A将持续读取out_q ,并且每当您的主进程向out_q 您的主进程发送消息时,都不会等待子进程的任何响应,您的子进程将使用该消息。通过消息队列进行的通信是异步的。但是,如果您仍然需要孩子的任何成功或失败信息之类的回复,您可以通过response_q 这将由您的父进程读取。要了解孩子对最初从父母发送的特定消息的响应,您可以使用相关 ID。(阅读有关相关 id 的信息)。现在在父进程中实现两个 2 线程,一个将连续读取到 Web 调用,另一个将读取到标准输入。还有一种方法(可能是静态的)将连接out_q 到丢弃消息。使用互斥锁,以便只有一个线程可以调用它并将消息发送到out_q. 您的主线程或进程将读取response_q. 通过这种方式,您可以使一切并行和异步。如果您不想使用线程,您仍然可以选择 fork() 并为其创建两个子进程。希望这会帮助你。

于 2017-10-17T20:45:35.677 回答