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.
This commit is contained in:
Nikolai Nechaev 2025-12-08 02:53:24 +09:00 committed by GitHub
parent 8ca40479a7
commit ca99e8228c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,5 @@
#include <csignal> #include <csignal>
#include <cstring>
#include <print> #include <print>
#include "helpers/Logger.hpp" #include "helpers/Logger.hpp"
@ -28,14 +29,23 @@ static void onSignal(int sig) {
exit(0); 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) { int main(int argc, const char** argv, const char** envp) {
g_logger = makeUnique<Hyprutils::CLI::CLoggerConnection>(*g_loggerMain); g_logger = makeUnique<Hyprutils::CLI::CLoggerConnection>(*g_loggerMain);
g_logger->setName("start-hyprland"); g_logger->setName("start-hyprland");
g_logger->setLogLevel(Hyprutils::CLI::LOG_DEBUG); g_logger->setLogLevel(Hyprutils::CLI::LOG_DEBUG);
signal(SIGTERM, ::onSignal); terminateChildOnSignal(SIGTERM);
signal(SIGINT, ::onSignal); terminateChildOnSignal(SIGINT);
signal(SIGKILL, ::onSignal);
int startArgv = -1; int startArgv = -1;
@ -84,4 +94,4 @@ int main(int argc, const char** argv, const char** envp) {
} }
return 0; return 0;
} }