あめだまふぁくとりー

Boost.Graphとかできますん

標準入出力を Boost.Asio で非同期に行う

標準入出力を Boost.Asio で非同期に行いたい場合は, posix::stream_descriptor を使用するといいみたいです.

使用例

#include <chrono>
#include <iostream>
#include <boost/asio/buffer.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/posix/stream_descriptor.hpp>
#include <boost/asio/read_until.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/asio/streambuf.hpp>
#include <unistd.h>

int main()
{
    namespace asio = boost::asio;

    asio::io_service io_service{};

    auto input = asio::posix::stream_descriptor{io_service, ::dup(STDIN_FILENO)};

    asio::spawn(io_service, [&](auto yield) {
        asio::steady_timer timer{io_service};
        while (not io_service.stopped()) {
            timer.expires_from_now(std::chrono::seconds{1});
            timer.async_wait(yield);
            std::cout << "ticktack..." << std::endl;
        }
    });

    asio::streambuf input_buffer{};
    asio::async_read_until(input, input_buffer, '\n', [&](auto& error, auto bytes_transferred) {
        std::cout << "input data: " << &input_buffer << std::endl;
        io_service.stop();
    });

    io_service.run();
}

出力結果

ticktack...
ticktack...
ticktack...
ticktack...
hgoe
input data: hgoe

buffered_read_stream とかと組み合わせると, 入出力のバッファリングもできるかも知れません (調べていないのでよく分かりません).