boost::process::async_pipe 或用于进程间通信的管道

问题描述 投票:0回答:1

我需要使用命名管道进行进程间消息传递。
我知道 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
c++ boost named-pipes
1个回答
0
投票

为什么还要有线程?

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();
}

¹ 模未处理的异常

© www.soinside.com 2019 - 2024. All rights reserved.