#include <stdexcept>
#include <string>
#include <iostream>
#include <thread>
#include <unistd.h>
void reader(std::string& out, int fd)
{
char buf[1024];
int rnum = 0;
do {
rnum = read(fd, buf, 1024);
if (rnum > 0) {
out.append(buf, rnum);
}
} while (rnum > 0);
}
void exec(const std::string& cmd, const std::string& in,
std::string& out, std::string& err)
{
int outfd[2];
int infd[2];
int errfd[2];
// Where the parent is going to write to
if (pipe(infd) != 0)
throw std::runtime_error("failed to create a pipe");
// From where parent is going to read
if (pipe(outfd) != 0)
throw std::runtime_error("failed to create a pipe");
if (pipe(errfd) != 0)
throw std::runtime_error("failed to create a pipe");
if (fork()==0) {
close(STDOUT_FILENO);
close(STDIN_FILENO);
close(STDERR_FILENO);
dup2(infd[0], STDIN_FILENO);
dup2(outfd[1], STDOUT_FILENO);
dup2(errfd[1], STDERR_FILENO);
close(outfd[0]); // Not required for the child
close(outfd[1]);
close(infd[0]);
close(infd[1]);
close(errfd[0]);
close(errfd[1]);
execl("/bin/bash", "bash", "-c", cmd.c_str(), 0);
exit(0);
} else {
//close unused file descriptors
close(infd[0]);
close(outfd[1]);
close(errfd[1]);
//create some threads to write to in[1] and read from out[0] err[0]
std::thread write_in(write, infd[1], in.c_str(), in.size());
std::thread read_out(reader, std::ref(out), outfd[0]);
std::thread read_err(reader, std::ref(err), errfd[0]);
write_in.join();
read_out.join();
read_err.join();
close(infd[1]);
close(outfd[0]);
close(errfd[0]);
}
}
int main()
{
std::string out, err;
exec("ls", "", out, err);
std::cout << out;
}
I2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgoKI2luY2x1ZGUgPHVuaXN0ZC5oPgoKdm9pZCByZWFkZXIoc3RkOjpzdHJpbmcmIG91dCwgaW50IGZkKQp7CiAgICBjaGFyIGJ1ZlsxMDI0XTsKICAgIGludCBybnVtID0gMDsKICAgIGRvIHsKICAgICAgICBybnVtID0gcmVhZChmZCwgYnVmLCAxMDI0KTsKICAgICAgICBpZiAocm51bSA+IDApIHsKICAgICAgICAgICAgb3V0LmFwcGVuZChidWYsIHJudW0pOwogICAgICAgIH0KICAgIH0gd2hpbGUgKHJudW0gPiAwKTsKfQoKdm9pZCBleGVjKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbiwKICAgICAgICBzdGQ6OnN0cmluZyYgb3V0LCBzdGQ6OnN0cmluZyYgZXJyKQp7CiAgICBpbnQgb3V0ZmRbMl07CiAgICBpbnQgaW5mZFsyXTsKICAgIGludCBlcnJmZFsyXTsKCiAgICAvLyBXaGVyZSB0aGUgcGFyZW50IGlzIGdvaW5nIHRvIHdyaXRlIHRvCiAgICBpZiAocGlwZShpbmZkKSAhPSAwKQogICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUiKTsKCiAgICAvLyBGcm9tIHdoZXJlIHBhcmVudCBpcyBnb2luZyB0byByZWFkCiAgICBpZiAocGlwZShvdXRmZCkgIT0gMCkKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIik7CiAgICBpZiAocGlwZShlcnJmZCkgIT0gMCkKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIik7CgogICAgaWYgKGZvcmsoKT09MCkgewogICAgICAgIGNsb3NlKFNURE9VVF9GSUxFTk8pOwogICAgICAgIGNsb3NlKFNURElOX0ZJTEVOTyk7CiAgICAgICAgY2xvc2UoU1RERVJSX0ZJTEVOTyk7CgogICAgICAgIGR1cDIoaW5mZFswXSwgIFNURElOX0ZJTEVOTyk7CiAgICAgICAgZHVwMihvdXRmZFsxXSwgU1RET1VUX0ZJTEVOTyk7CiAgICAgICAgZHVwMihlcnJmZFsxXSwgU1RERVJSX0ZJTEVOTyk7CgogICAgICAgIGNsb3NlKG91dGZkWzBdKTsgLy8gTm90IHJlcXVpcmVkIGZvciB0aGUgY2hpbGQKICAgICAgICBjbG9zZShvdXRmZFsxXSk7CiAgICAgICAgY2xvc2UoaW5mZFswXSk7CiAgICAgICAgY2xvc2UoaW5mZFsxXSk7CiAgICAgICAgY2xvc2UoZXJyZmRbMF0pOwogICAgICAgIGNsb3NlKGVycmZkWzFdKTsKCiAgICAgICAgZXhlY2woIi9iaW4vYmFzaCIsICJiYXNoIiwgIi1jIiwgY21kLmNfc3RyKCksIDApOwogICAgICAgIGV4aXQoMCk7CiAgICB9IGVsc2UgewogICAgICAgIC8vY2xvc2UgdW51c2VkIGZpbGUgZGVzY3JpcHRvcnMKICAgICAgICBjbG9zZShpbmZkWzBdKTsKICAgICAgICBjbG9zZShvdXRmZFsxXSk7CiAgICAgICAgY2xvc2UoZXJyZmRbMV0pOwoKICAgICAgICAvL2NyZWF0ZSBzb21lIHRocmVhZHMgdG8gd3JpdGUgdG8gaW5bMV0gYW5kIHJlYWQgZnJvbSBvdXRbMF0gZXJyWzBdCiAgICAgICAgc3RkOjp0aHJlYWQgd3JpdGVfaW4od3JpdGUsIGluZmRbMV0sIGluLmNfc3RyKCksIGluLnNpemUoKSk7CiAgICAgICAgc3RkOjp0aHJlYWQgcmVhZF9vdXQocmVhZGVyLCBzdGQ6OnJlZihvdXQpLCBvdXRmZFswXSk7CiAgICAgICAgc3RkOjp0aHJlYWQgcmVhZF9lcnIocmVhZGVyLCBzdGQ6OnJlZihlcnIpLCBlcnJmZFswXSk7CgogICAgICAgIHdyaXRlX2luLmpvaW4oKTsKICAgICAgICByZWFkX291dC5qb2luKCk7CiAgICAgICAgcmVhZF9lcnIuam9pbigpOwoKICAgICAgICBjbG9zZShpbmZkWzFdKTsKICAgICAgICBjbG9zZShvdXRmZFswXSk7CiAgICAgICAgY2xvc2UoZXJyZmRbMF0pOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3RyaW5nIG91dCwgZXJyOwogICAgZXhlYygibHMiLCAiIiwgb3V0LCBlcnIpOwogICAgc3RkOjpjb3V0IDw8IG91dDsKfQogCg==