2 * This file is part of the PulseView project.
4 * Copyright (C) 2013 Adam Reichold
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #include "signalhandler.hpp"
26 #include <sys/socket.h>
30 #include <QSocketNotifier>
32 int SignalHandler::sockets_
[2];
34 bool SignalHandler::prepare_signals()
36 if (socketpair(AF_UNIX
, SOCK_STREAM
, 0, sockets_
) != 0)
39 struct sigaction sig_action
;
41 sig_action
.sa_handler
= SignalHandler::handle_signals
;
42 sigemptyset(&sig_action
.sa_mask
);
43 sig_action
.sa_flags
= SA_RESTART
;
45 if (sigaction(SIGINT
, &sig_action
, nullptr) != 0 ||
46 sigaction(SIGTERM
, &sig_action
, nullptr) != 0) {
55 SignalHandler::SignalHandler(QObject
* parent
) : QObject(parent
),
56 socket_notifier_(nullptr)
58 socket_notifier_
= new QSocketNotifier(sockets_
[1],
59 QSocketNotifier::Read
, this);
60 connect(socket_notifier_
, SIGNAL(activated(int)),
61 SLOT(on_socket_notifier_activated()));
64 void SignalHandler::on_socket_notifier_activated()
66 socket_notifier_
->setEnabled(false);
69 if (read(sockets_
[1], &sig_number
, sizeof(int)) != sizeof(int)) {
70 qDebug() << "Failed to catch signal";
76 Q_EMIT
int_received();
79 Q_EMIT
term_received();
83 socket_notifier_
->setEnabled(true);
86 void SignalHandler::handle_signals(int sig_number
)
88 if (write(sockets_
[0], &sig_number
, sizeof(int)) != sizeof(int)) {
89 // Failed to handle signal