我需要使用命名管道进行进程间消息传递。
我知道 async_pipe 可用于命名管道。
但是当我尝试使用 async_pipe 时,我的程序在读取时卡在 io_context::run() 中
这是为什么?我什至可以通过这种方式使用它们进行进程间通信吗?
我尝试查找 stdout/stdin 重定向以外的信息,但没有成功。
这是我的程序
#include <thread>
#include <iostream>
#include "boost/asio.hpp"
#include "boost/process.hpp"
std::string create_named_pipe_name(const std::string& name)
{
return R"(\\.\pipe\)" + name;
}
int main(int argc, char* argv[])
{
asio::io_context io, io2;
bp::async_pipe p1(io, create_named_pipe_name("p"));
bp::async_pipe p2(io2, create_named_pipe_name("p"));
std::string messageToSend = "CCC";
std::vector<char> x(3, '*');
boost::asio::async_write(p1, boost::asio::buffer(messageToSend),
[&messageToSend](const boost::system::error_code& ec, std::size_t size)
{
if (!ec) {
std::cout << "Sent message: " << messageToSend << std::endl;
}
else {
std::cerr << "Failed to write to pipe: " << ec.message() << std::endl;
}
});
boost::asio::async_read(p2, boost::asio::buffer(x), [&x](const boost::system::error_code& ec, std::size_t size)
{
if (!ec) {
std::cout << "Received message: " << std::string(x.data(), size) << std::endl;
}
else {
std::cerr << "Failed to read from pipe: " << ec.message() << std::endl;
}
});
std::thread([&io]
{
io.run();
}).join();
auto t2 = std::thread([&io2]
{
io2.run();
});
t2.join();
}
输出:
Sent message: CCC
为什么还要有线程?
thread(f).join()
完全等同于 f();
¹
io.run();
io2.run();
我会简化以删除不必要的第二个上下文。两个 io 对象可以愉快地共享同一个。
接下来,您不能两次创建相同的管道。我不在 Windows 上,但在 POSIX 上它按预期失败了
terminate called after throwing an instance of 'boost::wrapexcept<boost::process::v1::process_error>'
what(): mkfifo() failed: File exists
相比之下,这有效:Live On Coliru
#include <boost/asio.hpp>
#include <boost/process.hpp>
#include <iostream>
namespace asio = boost::asio;
namespace bp = boost::process;
using error_code = boost::system::error_code;
int main() {
asio::io_context io;
bp::async_pipe p(io, R"(\\.\pipe\p)");
std::string outbuf = "CCC", inbuf(3, '*');
async_write(p, asio::buffer(outbuf), [](error_code ec, size_t size) {
std::cout << "Sent: " << size << " (" << ec.message() << ")" << std::endl;
});
async_read(p, asio::buffer(inbuf), [&inbuf](error_code ec, size_t /*size*/) {
std::cout << "Received: " << quoted(inbuf) << " (" << ec.message() << ")" << std::endl;
});
io.run();
}
¹ 模未处理的异常