Yanlış Kullanım
Elimizde şöyle bir kod olsun.
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