LINUX.ORG.RU

Qt и fork()


0

0

Хотелось бы по-настоящему форкнуться в Qt приложении, например в маленьком демоне, который одновременно работает с session dbus. Проблема в том, что после форка начинаются чудеса. Допустим демон работает нормально, и мы делаем рестарт для session dbus-a (например, выход/вход в KDE). Демон перестаёт соединяться с шиной вообще. Если убрать форк, то всё рабоатет отлично. Такое ощущение, что из-за использования каких-то статических переменных, а они в Qt много где, реинициализация этих переменных не работает в фокнутом процессе-ребёнке, и после рестарта session dbus-a форкнутный процесс пытается соединяться со старой шиной. Скрестить Qt и fork не получится?

Код:

#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusInterface>
#include <QTimer>

#include <unistd.h>

class A : public QObject
{
    Q_OBJECT

public:
    A()
    {
        QTimer *t = new QTimer(this);
        t->setSingleShot(false);
        t->setInterval(1000);
        connect(t, SIGNAL(timeout()), this, SLOT(slot()));

        t->start();
    }

public slots:
    void slot()
    {
        QDBusInterface di("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QDBusConnection::sessionBus());
        qDebug("%s", di.isValid() ? "valid" : "invalid");
    }
};

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);

    ::daemon(1, 1);

    new A;

    return app.exec();
}

#include "main.moc"

я не уверен, что и без qt это будет работать.

d-bus может и не пережить форка

namezys ★★★★ ()

Кури исходники KDE, там этих fork пруд пруди (работы с dbus, разумеется, тоже).

PayableOnDeath ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.