Add a detach function to the process handles

This commit is contained in:
Robbert van der Helm
2022-04-14 16:43:18 +02:00
parent 75b3cf266d
commit a5ded46f27
2 changed files with 15 additions and 5 deletions
+7 -3
View File
@@ -96,18 +96,18 @@ char* const* ProcessEnvironment::make_environ() const {
Process::Handle::Handle(pid_t pid) : pid_(pid) {} Process::Handle::Handle(pid_t pid) : pid_(pid) {}
Process::Handle::~Handle() { Process::Handle::~Handle() {
if (!is_moved_) { if (!detached_) {
// If this function has already been called then that's okay // If this function has already been called then that's okay
terminate(); terminate();
} }
} }
Process::Handle::Handle(Handle&& o) noexcept : pid_(o.pid_) { Process::Handle::Handle(Handle&& o) noexcept : pid_(o.pid_) {
o.is_moved_ = true; o.detached_ = true;
} }
Process::Handle& Process::Handle::operator=(Handle&& o) noexcept { Process::Handle& Process::Handle::operator=(Handle&& o) noexcept {
o.is_moved_ = true; o.detached_ = true;
pid_ = o.pid_; pid_ = o.pid_;
@@ -122,6 +122,10 @@ bool Process::Handle::running() const noexcept {
return pid_running(pid_); return pid_running(pid_);
} }
void Process::Handle::detach() noexcept {
detached_ = true;
}
void Process::Handle::terminate() const noexcept { void Process::Handle::terminate() const noexcept {
kill(pid_, SIGINT); kill(pid_, SIGINT);
wait(); wait();
+8 -2
View File
@@ -135,6 +135,11 @@ class Process {
*/ */
bool running() const noexcept; bool running() const noexcept;
/**
* Don't terminate the process when this object gets dropped.
*/
void detach() noexcept;
/** /**
* Forcefully terminate the process by sending `SIGKILL`. Will reap the * Forcefully terminate the process by sending `SIGKILL`. Will reap the
* process zombie after sending the signal. * process zombie after sending the signal.
@@ -149,9 +154,10 @@ class Process {
private: private:
/** /**
* If `true`, don't terminate the process * If `true`, don't terminate the process when this object gets dropped.
* Also set when this object gets moved from.
*/ */
bool is_moved_ = false; bool detached_ = false;
pid_t pid_ = 0; pid_t pid_ = 0;
}; };