Хотелось бы по-настоящему форкнуться в 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"