我的C ++程序分为两个进程,1个(原始)和2个(分叉进程)。
在分叉过程(2)中,它执行程序A执行大量计算。
原始流程(1)通过标准输入和输出与程序A进行通信,重定向到管道。
我正在尝试在原始流程(1)中为我的代码添加websocket连接。我希望我的原始进程有效地选择或epoll是否有数据要从管道读取到程序A,或者是否有要从websocket连接读取的数据。
鉴于野兽websocket不是文件描述符,我怎么能做select或epoll的效果?
答案 0 :(得分:3)
您使用的是哪个版本的Boost?如果它是相对较新的,它应该包括对boost::process::async_pipe的支持,它允许您使用除套接字之外的I / O对象与Asio异步。 tutorials for the boost::process library中提供了示例。由于引擎盖下的Beast uses the Asio library to perform I/O,您可以很容易地将两者结合起来。
鉴于野兽websocket不是文件描述符......
Beast WebSocket不是文件描述符,但它确实使用TCP套接字来执行I / O(参见上面的链接示例),Asio非常擅长使用带有TCP套接字的select / epoll。确保您照常执行async_read
,async_write
和io_service::run
操作。
答案 1 :(得分:1)
您可以对代码进行少许更改。用两个Message Queue
替换管道。例如out_q
和response_q
。现在,您的子流程A
将继续阅读out_q
,当您的主要流程向out_q
发送消息时,您的主流程将不会等待来自孩子的任何回复,您的孩子将会消费该消息。通过消息队列的通信是异步的。但是,如果你仍然需要一种来自孩子的成功或失败消息的回复,你可以通过response_q
获得它,这将由你的父进程读取。要知道来自孩子的响应最初从父发送的特定消息,您可以使用相关ID。 (关于相关id很少阅读)。
现在在父进程中实现两个2个线程,一个将连续读取到Web调用,另一个将读取到标准输入。并且一个方法(可能是静态的)将连接到out_q
以丢弃消息。使用互斥锁,这样只有一个线程可以调用它并将消息丢弃到out_q
。您的主要主题或流程将阅读response_q
。通过这种方式,您可以使所有内容并行和异步。如果你不想使用线程,你可以选择fork()并为它创建两个子进程。希望这会对你有所帮助。