diff options
| author | Nikolai Nechaev <nikolay_nechaev@mail.ru> | 2025-12-08 02:53:24 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-07 17:53:24 +0000 |
| commit | ca99e8228cd3b2fa062d74f16c0531f217d722b2 (patch) | |
| tree | 2c525f549ce260fbe51e3e23367ce49a53717f69 /start/src/main.cpp | |
| parent | 8ca40479a72cdc722bf2144e51428224731aa04d (diff) | |
internal/start: More careful signal handling (#12573)
- Take out signal set up into a subroutine;
- Use `sigaction` instead of `signal` for consistent behavior across UNIX platforms;
- Enable a warning when a signal handler set up fails;
- Don't do anything to SIGKILL, since it cannot be handled.
Diffstat (limited to 'start/src/main.cpp')
| -rw-r--r-- | start/src/main.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/start/src/main.cpp b/start/src/main.cpp index 78fbf0f4..74de393c 100644 --- a/start/src/main.cpp +++ b/start/src/main.cpp @@ -1,4 +1,5 @@ #include <csignal> +#include <cstring> #include <print> #include "helpers/Logger.hpp" @@ -28,14 +29,23 @@ static void onSignal(int sig) { exit(0); } +static void terminateChildOnSignal(int signal) { + struct sigaction sa; + sa.sa_handler = onSignal; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + int ret = sigaction(signal, &sa, nullptr); + if (ret != 0) + g_logger->log(Hyprutils::CLI::LOG_WARN, "Failed to set up handler for signal {}: {}", signal, strerror(errno)); +} + int main(int argc, const char** argv, const char** envp) { g_logger = makeUnique<Hyprutils::CLI::CLoggerConnection>(*g_loggerMain); g_logger->setName("start-hyprland"); g_logger->setLogLevel(Hyprutils::CLI::LOG_DEBUG); - signal(SIGTERM, ::onSignal); - signal(SIGINT, ::onSignal); - signal(SIGKILL, ::onSignal); + terminateChildOnSignal(SIGTERM); + terminateChildOnSignal(SIGINT); int startArgv = -1; @@ -84,4 +94,4 @@ int main(int argc, const char** argv, const char** envp) { } return 0; -}
\ No newline at end of file +} |
