26 Mart 2018 Pazartesi

process child Sınıfı asio::buffer Kullanarak Çıktıyı Okumak

Giriş
Asenkron olarak uygulamayı çalıştırır. Belirtilen buffer kadar okur. Eğer çıktı buffer'dan büyükse çıktının gerisi kırpılır. Bu örneklerde async_pipe kullanılmıyor ve daha kolay. Açıklaması şöyle
async_pipe with async_read only reads until the buffer is full or EOF is reached. If the child process outputs more than the buffer size (8k in your sample) then it will get stuck and never finish.
Burada buffer küçük olduğu için takılma olmayacağını yani uygulamalar arası pipe'ın otomatik kapatıldığı için çalıştırılan uygulamanın düzgünce çıktığını düşünüyorum.

buffer olarak std::array std::vector kullanılabilir.

Örnek
Şöyle yaparız. Boost örneklerinde vector için bellek ayrılmıyor ve yanlış. Aslında ayırmak lazım.
boost::asio::io_service ios;
boost::asio::io_service::work work;
bp::async_pipe ap;
std::vector<char> buf (1024);



void read(const boost::system::error_code& ec,std::size_t size) {
  std::cout << ec << std::endl;
  std::cout << size << std::endl;
}


bp::child c(bp::search_path("ls"), ".", bp::std_out > ap);
boost::asio::async_read(ap, boost::asio::buffer(buf),
  boost::bind(&test::read,
              this,
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred));

ios.run();
Örnek
Şöyle yaparız. Çıktı std::array olduğu için büyüyemez ve 8K ile sınırlıdır.
namespace bp   = boost::process;
using Args     = std::vector<std::string>;
using Buffer8k = std::array<char, 8192>;


auto a1 = std::make_unique<Buffer8k>(),
a2 = std::make_unique<Buffer8k>();

*a1 = {};
*a2= {};

boost::asio::io_service ios;

bp::child first("/bin/echo", Args{"-n", "first"}, bp::std_out > boost::asio::buffer(*a1),
  ios);
bp::child second("/bin/echo", Args{"-n", "second"}, bp::std_out >boost::asio::buffer(*a2),
  ios);

std::cout << "Launched" << std::endl;

ios.run();
first.wait();
second.wait();

std::string const str1(a1->data()); // uses NUL-termination (assumes text output)
std::string const str2(a2->data()); // uses NUL-termination (assumes text output)

Hiç yorum yok:

Yorum Gönder