From 6a963ffcc9eb63749ac158fd63851131b3b72a94 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 17 Mar 2018 12:26:37 +0800 Subject: [PATCH] Add POSIX equivalent for detecting parent termination --- src/main_loop.cpp | 8 ++++++++ src/utils/separate_process.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/main_loop.cpp b/src/main_loop.cpp index 4f40fce35..30490f4d1 100644 --- a/src/main_loop.cpp +++ b/src/main_loop.cpp @@ -44,6 +44,10 @@ #include "states_screens/state_manager.hpp" #include "utils/profiler.hpp" +#ifndef WIN32 +#include +#endif + MainLoop* main_loop = 0; MainLoop::MainLoop(unsigned parent_pid) @@ -323,6 +327,10 @@ void MainLoop::run() if (WaitForSingleObject(parent, 0) != WAIT_TIMEOUT) m_abort = true; } +#else + // POSIX equivalent + if (m_parent_pid != 0 && getppid() != (int)m_parent_pid) + m_abort = true; #endif m_is_last_substep = false; PROFILER_PUSH_CPU_MARKER("Main loop", 0xFF, 0x00, 0xF7); diff --git a/src/utils/separate_process.cpp b/src/utils/separate_process.cpp index b31864667..5d19bebe9 100644 --- a/src/utils/separate_process.cpp +++ b/src/utils/separate_process.cpp @@ -253,6 +253,9 @@ bool SeparateProcess::createChildProcess(const std::string& exe, } } + std::string parent_pid = "--parent-process="; + int current_pid = getpid(); + parent_pid += StringUtils::toString(current_pid); child = fork(); if (child == 0) { @@ -289,6 +292,7 @@ bool SeparateProcess::createChildProcess(const std::string& exe, argv.push_back(const_cast(exe_file.c_str())); for (unsigned i = 0; i < rest_argv.size(); i++) argv.push_back(const_cast(rest_argv[i].c_str())); + argv.push_back(const_cast(parent_pid.c_str())); argv.push_back(NULL); execvp(exe.c_str(), argv.data()); Log::error("SeparateProcess", "Error in execl: errnp %d", errno);