23 #include <QSocketNotifier>
30 #include <sys/socket.h>
31 #include <sys/types.h>
41 static std::atomic_flag g_signalSocketUsageFlag = ATOMIC_FLAG_INIT;
42 static std::array<int, 2> g_signalSocketPair;
44 static void signalHandler(
int signum)
53 if (g_signalSocketUsageFlag.test_and_set())
56 if(::write(g_signalSocketPair[0], &signum,
sizeof(signum)) == -1) {
63 g_signalSocketUsageFlag.clear();
70 while (detail::g_signalSocketUsageFlag.test_and_set()) {
75 ::close(detail::g_signalSocketPair[0]);
76 ::close(detail::g_signalSocketPair[1]);
84 sigemptyset(&blockMask);
85 sigaddset(&blockMask, signum);
87 struct sigaction action = {};
88 action.sa_handler = detail::signalHandler;
89 action.sa_mask = blockMask;
91 if (::sigaction(signum, &action,
nullptr)) {
92 qFatal(
"Failed to setup signal %d, error = %d", signum, errno);
98 for (
auto s: signalSet) {
117 if (::read(detail::g_signalSocketPair[1], &signum,
sizeof(signum)) == -1) {
118 qFatal(
"Failed to read from signal socket, error = %d", errno);
121 qDebug() <<
"Signal" << signum <<
"received";
127 if (::socketpair(AF_UNIX, SOCK_STREAM, 0, detail::g_signalSocketPair.data())) {
128 qFatal(
"Failed to create socket pair, error = %d", errno);
131 notifier =
new QSocketNotifier(detail::g_signalSocketPair[1], QSocketNotifier::Read,
this);