19#include "UnixSignalHandler.h"
24#include <sys/socket.h>
27int UnixSignalHandler::sighupFd[2];
28int UnixSignalHandler::sigintFd[2];
29int UnixSignalHandler::sigtermFd[2];
31UnixSignalHandler::UnixSignalHandler(
const std::function<
void()>& f, QObject *parent)
35 if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sighupFd))
37 qFatal(
"Couldn't create HUP socketpair");
39 if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigintFd))
41 qFatal(
"Couldn't create INT socketpair");
43 if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd))
45 qFatal(
"Couldn't create TERM socketpair");
48 m_socketNotifierHup =
new QSocketNotifier(sighupFd[1], QSocketNotifier::Read,
this);
49 connect(m_socketNotifierHup, &QSocketNotifier::activated,
this, &UnixSignalHandler::handleSigHup);
50 m_socketNotifierInt =
new QSocketNotifier(sigintFd[1], QSocketNotifier::Read,
this);
51 connect(m_socketNotifierInt, &QSocketNotifier::activated,
this, &UnixSignalHandler::handleSigInt);
52 m_socketNotifierTerm =
new QSocketNotifier(sigtermFd[1], QSocketNotifier::Read,
this);
53 connect(m_socketNotifierTerm, &QSocketNotifier::activated,
this, &UnixSignalHandler::handleSigTerm);
56void UnixSignalHandler::hupSignalHandler(
int)
59 ::write(sighupFd[0], &a,
sizeof(a));
62void UnixSignalHandler::intSignalHandler(
int)
65 ::write(sigintFd[0], &a,
sizeof(a));
68void UnixSignalHandler::termSignalHandler(
int)
71 ::write(sigtermFd[0], &a,
sizeof(a));
74int UnixSignalHandler::setupUnixSignalHandlers()
76 struct sigaction sighup, sigint, sigterm;
78 sighup.sa_handler = UnixSignalHandler::hupSignalHandler;
79 sigemptyset(&sighup.sa_mask);
80 sighup.sa_flags = SA_RESTART;
82 if (sigaction(SIGHUP, &sighup, 0) > 0)
87 sigint.sa_handler = UnixSignalHandler::intSignalHandler;
88 sigemptyset(&sigint.sa_mask);
89 sigint.sa_flags = SA_RESTART;
91 if (sigaction(SIGINT, &sigint, 0) > 0)
96 sigterm.sa_handler = UnixSignalHandler::termSignalHandler;
97 sigemptyset(&sigterm.sa_mask);
98 sigterm.sa_flags = SA_RESTART;
100 if (sigaction(SIGTERM, &sigterm, 0) > 0)
108void UnixSignalHandler::handleSigHup()
110 m_socketNotifierHup->setEnabled(
false);
112 ::read(sighupFd[1], &tmp,
sizeof(tmp));
116 m_socketNotifierHup->setEnabled(
true);
119void UnixSignalHandler::handleSigInt()
121 m_socketNotifierInt->setEnabled(
false);
123 ::read(sigintFd[1], &tmp,
sizeof(tmp));
127 m_socketNotifierInt->setEnabled(
true);
130void UnixSignalHandler::handleSigTerm()
132 m_socketNotifierTerm->setEnabled(
false);
134 ::read(sigtermFd[1], &tmp,
sizeof(tmp));
138 m_socketNotifierTerm->setEnabled(
true);