Add kill and poll features for processes

This commit is contained in:
TheAssassin
2020-08-07 15:32:07 +02:00
parent 80a5667ca7
commit c895a1dc59
2 changed files with 35 additions and 3 deletions
+14 -1
View File
@@ -1,6 +1,7 @@
// system headers
#include <unordered_map>
#include <vector>
#include <signal.h>
// local headers
#include "linuxdeploy/subprocess/subprocess.h"
@@ -62,10 +63,22 @@ namespace linuxdeploy {
int stderr_fd() const;
/**
* Close all pipes and wait for process to exit. If process was closed already, just returns exit code.
* Close all pipes and wait for process to exit.
* If process is not running any more, just returns exit code.
* @return child process's exit code
*/
int close();
/**
* Kill underlying process with given signal. By default, SIGTERM is used to end the process.
*/
void kill(int signal = SIGTERM) const;
/**
* Check whether process is still alive. Use close() to fetch exit code.
* @return true while process is alive, false otherwise
*/
bool poll();
};
}
}
+21 -2
View File
@@ -54,8 +54,6 @@ process::process(const std::vector<std::string>& args, const subprocess_env_map_
throw std::runtime_error{"fork() failed"};
}
std::cout << "child pid: " << std::to_string(child_pid_) << std::endl;
if (child_pid_ == 0) {
// we're in the child process
@@ -190,3 +188,24 @@ std::vector<char*> process::make_env_vector_(const subprocess_env_map_t& env) {
return rv;
}
void process::kill(int signal) const {
if (::kill(child_pid_, signal) != 0) {
throw std::logic_error{"failed to kill child process"};
}
}
bool process::poll() {
if (exited_) {
return false;
}
int temporary;
if (waitpid(child_pid_, &temporary, WNOHANG) != 0) {
return true;
}
exit_code_ = WEXITSTATUS(temporary);
return false;
}