Gracefully handling signals

Signed-off-by: Dušan Poizl <nou.spiro@gmail.com>
This commit is contained in:
2017-01-06 16:51:48 +01:00
parent 01ee5bc4b3
commit 909a2f75c7
2 changed files with 46 additions and 0 deletions
+40
View File
@@ -11,6 +11,11 @@
#include <QDebug>
#include <sys/ioctl.h>
#include <linux/btrfs.h>
#include <signal.h>
#include <unistd.h>
#include <sys/socket.h>
int MainWindow::socketPair[2] = {0, 0};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
loading(false),
@@ -50,6 +55,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
m_database = new Database(this);
if(!m_database->init())
QMessageBox::critical(this, tr("Can't open DB"), tr("Can't open SQLITE database"));
setupSigterm();
}
MainWindow::~MainWindow()
@@ -87,6 +94,39 @@ void MainWindow::keyReleaseEvent(QKeyEvent *event)
event->ignore();
}
void MainWindow::setupSigterm()
{
struct sigaction signal;
signal.sa_handler = MainWindow::signalHandler;
sigemptyset(&signal.sa_mask);
signal.sa_flags = 0;
signal.sa_flags |= SA_RESTART;
sigaction(SIGHUP, &signal, 0);
sigaction(SIGTERM, &signal, 0);
sigaction(SIGINT, &signal, 0);
::socketpair(AF_UNIX, SOCK_STREAM, 0, socketPair);
socketNotifier = new QSocketNotifier(socketPair[1], QSocketNotifier::Read, this);
connect(socketNotifier, SIGNAL(activated(int)), this, SLOT(socketNotify()));
}
void MainWindow::signalHandler(int)
{
char a = 1;
::write(socketPair[0], &a, sizeof(a));
}
void MainWindow::socketNotify()
{
socketNotifier->setEnabled(false);
char tmp;
read(socketPair[1], &tmp, sizeof(tmp));
close();
socketNotifier->setEnabled(true);
}
void MainWindow::pixmapLoaded(QPixmap pix)
{
m_image->setImage(pix);
+6
View File
@@ -2,6 +2,7 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSocketNotifier>
#include "imageringlist.h"
#include "imagescrollarea.h"
#include "database.h"
@@ -14,13 +15,18 @@ class MainWindow : public QMainWindow
Database *m_database;
bool loading;
int queued;
static int socketPair[2];
QSocketNotifier *socketNotifier;
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void setupSigterm();
static void signalHandler(int);
protected slots:
void socketNotify();
void updateWindowTitle();
void pixmapLoaded(QPixmap pix);
void openFile();