Guest User

Untitled

a guest
Nov 20th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. #include <sys/wait.h>
  2. #include <unistd.h>
  3. #include <string>
  4. #include <vector>
  5.  
  6. std::string qx(const std::vector<std::string>& args) {
  7. int stdout_fds[2];
  8. pipe(stdout_fds);
  9.  
  10. int stderr_fds[2];
  11. pipe(stderr_fds);
  12.  
  13. const pid_t pid = fork();
  14. if (!pid) {
  15. close(stdout_fds[0]);
  16. dup2(stdout_fds[1], 1);
  17. close(stdout_fds[1]);
  18.  
  19. close(stderr_fds[0]);
  20. dup2(stderr_fds[1], inc_stderr, 2);
  21. close(stderr_fds[1]);
  22.  
  23. std::vector<char*> vc(args.size() + 1, NULL);
  24. for (size_t i = 0; i < args.size(); ++i) {
  25. vc[i] = const_cast<char*>(args[i].c_str());
  26. }
  27.  
  28. execvp(vc[0], &vc[0]);
  29. exit(0);
  30. }
  31.  
  32. close(stdout_fds[1]);
  33.  
  34. std::string out;
  35. const int buf_size = 4096;
  36. char buffer[buf_size];
  37. do {
  38. const ssize_t r = read(stdout_fds[0], buffer, buf_size);
  39. if (r > 0) {
  40. out.append(buffer, r);
  41. }
  42. } while (errno == EAGAIN || errno == EINTR);
  43.  
  44. close(stdout_fds[0]);
  45.  
  46. close(stderr_fds[1]);
  47. close(stderr_fds[0]);
  48.  
  49. int r, status;
  50. do {
  51. r = waitpid(pid, &status, 0);
  52. } while (r == -1 && errno == EINTR);
  53.  
  54. return out;
  55. }
  56.  
  57. int main() {
  58. qx({"openssl", "hjas"});
  59. qx({"openssl", "dkjsah"});
  60. qx({"uname"});
  61. qx({"uname"});
  62. }
Add Comment
Please, Sign In to add comment