#ifndef _WIN32 static bool Spawn(const char* const* cmd, uint32_t cmdSize) { if (cmdSize <= 1) return false; if (cmd[cmdSize - 1] != nullptr) return false; static bool reaperInstalled = false; if (!reaperInstalled) { struct sigaction sa = { }; sa.sa_handler = [](int) -> void { pid_t pid; int status; while ((pid = waitpid(-1, &status, WNOHANG)) > 0) ; }; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, nullptr) == -1) { LOG("sigaction failed"); return false; } reaperInstalled = true; } switch (fork()) { case -1: return false; case 0: break; default: return true; } int devNullFd = open("/dev/null", O_RDWR); if (devNullFd != -1) { dup2(devNullFd, STDIN_FILENO); dup2(devNullFd, STDOUT_FILENO); dup2(devNullFd, STDERR_FILENO); } if (close_range(3, ~0U, CLOSE_RANGE_UNSHARE) != 0) _exit(127); execvp(cmd[0], (char* const*)cmd); _exit(127); } #endif