標準入出力を 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 とかと組み合わせると, 入出力のバッファリングもできるかも知れません (調べていないのでよく分かりません).