Add signalfd-based signal handling to psignal module

- psignal_init_signalfd(): Initialize signalfd for signal handling
- psignal_read_signalfd(): Read and process signals from signalfd
This commit is contained in:
Levi Neely 2026-03-09 22:26:45 +01:00
parent 0c0c6855c1
commit 4a0e17aafb
2 changed files with 41 additions and 0 deletions

View File

@ -5,6 +5,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/signalfd.h>
#include <errno.h>
#define PSIGNAL_MAX_CLEANUPS 16
static void (*cleanup_fns[PSIGNAL_MAX_CLEANUPS])(void);
@ -129,3 +131,40 @@ int psignal_check_pending(void) {
}
return 0;
}
int psignal_init_signalfd(void) {
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGHUP);
if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
return -1;
int fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
return fd;
}
int psignal_read_signalfd(int fd) {
struct signalfd_siginfo fdsi;
ssize_t s = read(fd, &fdsi, sizeof(struct signalfd_siginfo));
if (s != sizeof(struct signalfd_siginfo)) {
if (s == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
return 0;
return -1;
}
int signum = fdsi.ssi_signo;
if (signum == SIGINT) {
sigint_flag = 1;
} else if (signum == SIGTERM) {
sigterm_flag = 1;
} else if (signum == SIGHUP) {
sighup_flag = 1;
}
return signum;
}

View File

@ -12,6 +12,8 @@ int psignal_check_pending(void);
void psignal_set_custom_handler(int sig, void (*handler)(int));
void psignal_register_cleanup(void (*fn)(void));
void panic(const char *msg) __attribute__((noreturn));
int psignal_init_signalfd(void);
int psignal_read_signalfd(int fd);
#ifdef __cplusplus
}