#include #include std::filesystem::path os::process::detail::GetExecutablePath() { char exePath[PATH_MAX] = {}; if (readlink("/proc/self/exe", exePath, PATH_MAX) > 0) { return std::filesystem::path(std::u8string_view((const char8_t*)(exePath))); } else { return std::filesystem::path(); } } std::filesystem::path os::process::detail::GetWorkingDirectory() { char cwd[PATH_MAX] = {}; char *res = getcwd(cwd, sizeof(cwd)); if (res != nullptr) { return std::filesystem::path(std::u8string_view((const char8_t*)(cwd))); } else { return std::filesystem::path(); } } bool os::process::detail::StartProcess(const std::filesystem::path path, const std::vector args, std::filesystem::path work) { pid_t pid = fork(); if (pid < 0) return false; if (pid == 0) { setsid(); std::u8string workU8 = work.u8string(); chdir((const char*)(workU8.c_str())); std::u8string pathU8 = path.u8string(); std::vector argStrs; argStrs.push_back((char*)(pathU8.c_str())); for (const std::string& arg : args) argStrs.push_back((char *)(arg.c_str())); argStrs.push_back(nullptr); execvp((const char*)(pathU8.c_str()), argStrs.data()); raise(SIGKILL); } return true; }