7 Mart 2018 Çarşamba

process child Sınıfı Çıktıyı Okumak

Yanlış Kullanım
Elimizde şöyle bir kod olsun.
boost::process::ipstream output;
std::string cmdline = "/bin/bash";
boost::process::child c(cmdline.c_str(),
  std::vector<std::string> { "-c",alo
    "(dd if=/dev/urandom bs=1024 count=10 | xxd); echo -e '\\nComplete, bye!'" },
  boost::process::std_in.close(),
  boost::process::std_out > output);
ipstream'i okuyan elimizde şöyle bir kod olsun.
static constexpr size_t buf_size = 4096;

bool ReadPipe(boost::process::ipstream &pipe, std::vector<char> &output)
{
  char buffer[buf_size];
  pipe.read(buffer, sizeof(buffer));
  auto bytesRead = pipe.gcount();
  if (bytesRead)
    output.insert(output.end(), buffer, buffer + bytesRead);

    return bytesRead != 0;
}
Şöyle yaparsak uygulama kapandıktan sonra ipstream nesnesini okumaya çalışmak bir şekilde hataya sebep oluyor. Şu kod çıktıyı yarım alıyor.
std::vector<char> processOutput;

boost::process::child c = ...

while (c.running())
  ReadPipe(output, processOutput);
ipsteram yerine direkt vector'e yazdırırız. Şöyle yaparız.
std::vector<char> processOutput;
std::string cmdline = "/bin/bash";
boost::process::child c(cmdline.c_str(),
  std::vector<std::string> { "-c",
   "(dd if=/dev/urandom bs=1024 count=10 | xxd); echo -e '\\nComplete, bye!'" },
  boost::process::std_in.close(),
  boost::process::std_out > processOutput);

c.wait();

std::cout.write(processOutput.data(), processOutput.size()) << std::endl;

Hiç yorum yok:

Yorum Gönder