diff --git a/external/process-cpp-minimal/include/core/posix/child_process.h b/external/process-cpp-minimal/include/core/posix/child_process.h index d6b3b31..fde7977 100644 --- a/external/process-cpp-minimal/include/core/posix/child_process.h +++ b/external/process-cpp-minimal/include/core/posix/child_process.h @@ -114,6 +114,12 @@ public: */ wait::Result wait_for(const wait::Flags& flags); + /** + * @brief Mark the child process to not to be killed when the ChildProcess + * instance goes away. + */ + void dont_kill_on_cleanup(); + #ifndef ANDROID /** * @brief Access this process's stderr. diff --git a/external/process-cpp-minimal/src/core/posix/child_process.cpp b/external/process-cpp-minimal/src/core/posix/child_process.cpp index b121b89..ad16571 100644 --- a/external/process-cpp-minimal/src/core/posix/child_process.cpp +++ b/external/process-cpp-minimal/src/core/posix/child_process.cpp @@ -303,7 +303,7 @@ struct ChildProcess::Private ~Private() { // Check if we are in the original parent process. - if (original_parent_pid == getpid()) + if (original_parent_pid == getpid() && !dont_kill_on_cleanup) { // If so, check if we are considering a valid pid here. // If so, we kill the original child. @@ -333,6 +333,8 @@ struct ChildProcess::Private // is called from the child process. pid_t original_parent_pid; pid_t original_child_pid; + + bool dont_kill_on_cleanup = false; }; ChildProcess ChildProcess::invalid() @@ -395,6 +397,11 @@ wait::Result ChildProcess::wait_for(const wait::Flags& flags) return result; } +void ChildProcess::dont_kill_on_cleanup() +{ + d->dont_kill_on_cleanup = true; +} + #ifndef ANDROID std::istream& ChildProcess::cerr() {