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:
parent
0c0c6855c1
commit
4a0e17aafb
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue