Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ //! [0]
++ class MyDaemon : public QObject
++ {
++ Q_OBJECT
++
++ public:
++ MyDaemon(QObject *parent = 0);
++ ~MyDaemon();
++
++ // Unix signal handlers.
++ static void hupSignalHandler(int unused);
++ static void termSignalHandler(int unused);
++
++ public slots:
++ // Qt signal handlers.
++ void handleSigHup();
++ void handleSigTerm();
++
++ private:
++ static int sighupFd[2];
++ static int sigtermFd[2];
++
++ QSocketNotifier *snHup;
++ QSocketNotifier *snTerm;
++ };
++ //! [0]
++
++
++ //! [1]
++ MyDaemon::MyDaemon(QObject *parent)
++ : QObject(parent)
++ {
++ if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sighupFd))
++ qFatal("Couldn't create HUP socketpair");
++
++ if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd))
++ qFatal("Couldn't create TERM socketpair");
++ snHup = new QSocketNotifier(sighupFd[1], QSocketNotifier::Read, this);
++ connect(snHup, &QSocketNotifier::activated, this, &MyDaemon::handleSigHup);
++ snTerm = new QSocketNotifier(sigtermFd[1], QSocketNotifier::Read, this);
++ connect(snTerm, &QSocketNotifier::activated, this, &MyDaemon::handleSigTerm);
++
++ ...
++ }
++ //! [1]
++
++ //! [Init]
++ int MyDaemon::sighupFd[2] = {0, 0};
++ int MyDaemon::sigtermFd[2] = {0, 0};
++ //! [Init]
++
++ //! [2]
++ static int setup_unix_signal_handlers()
++ {
++ struct sigaction hup, term;
++
++ hup.sa_handler = MyDaemon::hupSignalHandler;
++ sigemptyset(&hup.sa_mask);
++ hup.sa_flags = 0;
++ hup.sa_flags |= SA_RESTART;
++
++ if (sigaction(SIGHUP, &hup, 0))
++ return 1;
++
++ term.sa_handler = MyDaemon::termSignalHandler;
++ sigemptyset(&term.sa_mask);
++ term.sa_flags = 0;
++ term.sa_flags |= SA_RESTART;
++
++ if (sigaction(SIGTERM, &term, 0))
++ return 2;
++
++ return 0;
++ }
++ //! [2]
++
++
++ //! [3]
++ void MyDaemon::hupSignalHandler(int)
++ {
++ char a = 1;
++ ::write(sighupFd[0], &a, sizeof(a));
++ }
++
++ void MyDaemon::termSignalHandler(int)
++ {
++ char a = 1;
++ ::write(sigtermFd[0], &a, sizeof(a));
++ }
++ //! [3]
++
++
++ //! [4]
++ void MyDaemon::handleSigTerm()
++ {
++ snTerm->setEnabled(false);
++ char tmp;
++ ::read(sigtermFd[1], &tmp, sizeof(tmp));
++
++ // do Qt stuff
++
++ snTerm->setEnabled(true);
++ }
++
++ void MyDaemon::handleSigHup()
++ {
++ snHup->setEnabled(false);
++ char tmp;
++ ::read(sighupFd[1], &tmp, sizeof(tmp));
++
++ // do Qt stuff
++
++ snHup->setEnabled(true);
++ }
++ //! [4]