4 #include <msp/core/systemerror.h>
5 #include <msp/fs/dir.h>
6 #include <msp/io/console.h>
9 #include "process_private.h"
18 void Process::platform_get_self_info(Private &priv)
20 priv.info.pid = getpid();
23 void Process::execute(const string &command, bool path_search, const Arguments &args)
30 throw system_error("fork");
35 vector<const char *> argv(args.size()+2);
36 argv[0] = command.c_str();
37 for(unsigned i=0; i<args.size(); ++i)
38 argv[i+1] = args[i].c_str();
39 argv[args.size()+1] = nullptr;
43 // dup2 clears O_CLOEXEC
45 IO::cin.redirect(*cin);
47 IO::cout.redirect(*cout);
49 IO::cerr.redirect(*cerr);
56 execvp(command.c_str(), const_cast<char *const *>(&argv[0]));
58 execv(command.c_str(), const_cast<char *const *>(&argv[0]));
71 bool Process::wait(bool block)
74 throw invalid_state("not running");
77 int pid = waitpid(priv->info.pid, &status, (block ? 0 : WNOHANG));
79 throw system_error("waitpid");
86 exit_code = WEXITSTATUS(status);
87 else if(WIFSIGNALED(status))
88 exit_code = 0x100|WTERMSIG(status);
94 void Process::terminate()
96 ::kill(priv->info.pid, SIGTERM);
101 ::kill(priv->info.pid, SIGKILL);
104 void Process::interrupt()
106 ::kill(priv->info.pid, SIGINT);
110 Process::Private::Private()