простой демон-сервер с QT

Я пытаюсь использовать Qt для создания серверной/клиентской программы, которая работает с Inetd/xinetd в ОС Linux.

Я добавил файл конфигурации службы в /etc/xinetd.d/testServ с этим текстом

service testServ
{
  socket_type = stream
  protocol = tcp
  wait = no
  user = root
 server = /usr/sbin/testServer
 }

Затем я добавил эту строку в /etc/services

 testServ   5050/tcp    # the service uses the port nr 5050 and tcp protocol

Я создал специальную клиентскую программу, которая подключается к серверу с указанным портом и работает без проблем.

Проблема в серверной программе. Я написал этот код в основной функции серверной программы

Int main(int argc, char *argv[]) {
  qDebug()<<"starting the daemon version of server client app";
  QApplication app(argc, argv);
  setvbuf(stdout, NULL, _IONBF, 0);
  setvbuf(stdin,  NULL, _IONBF, 0);
  QFile fstdin;
  QFile fstdout;
  fstdout.open(stdout, QFile::WriteOnly|QFile::Unbuffered);
  fstdin.open(stdin, QFile::ReadOnly);
  CleintProcess clientproc (NULL, &slog, argc, argv, &fstdin, &fstdout);
  app.exec();
  return 0;
}

Проблема с серверной программой во второй строке основной функции, после этой строки программа не продолжается. Если я печатаю что-то после этой строки, оно не появляется на экране, но если я печатаю что-то до этой строки, появляется сообщение о печати. Я не знаю, почему Inetd/xinetd не работает с QApplication app(argc, argv);

когда я удаляю эту строку и другую строку (app.exe), программа завершается напрямую.

Мне нужно QApplication, потому что я много раз использую его в объекте clientproc(....).

Можете ли вы помочь мне решить эту проблему и заставить qt работать с inetd/xinetd в Linux.


person Waleed A    schedule 27.06.2016    source источник
comment
Просто небольшое уточнение: серверная программа не запускается через inetd? Как насчет отладки серверной части? Это продолжается? Если да, может ли это быть проблемой прав доступа, потому что Qt построен динамически?   -  person maxik    schedule 28.06.2016
comment
@maxik да, когда я отлаживаю на стороне сервера, он продолжает работать. Но когда я пытаюсь использовать серверную программу через Inetd, она останавливается на строке, где находится приложение QApplication (argc, argv), и не дает никакого вывода. может быть, как вы сказали, это проблема с правами доступа! как это решить   -  person Waleed A    schedule 28.06.2016
comment
Это огромное поле для беспокойства... Вы можете начать с пользователя, который выполняет службы intd, и его прав. Другое дело развертывание, если ваша «серверная сторона» не находится на вашей машине разработки. Возможно, вам не хватает некоторых плагинов Qt, которые загружаются во время запуска приложения. В любом случае, демон должен предоставить некоторые надлежащие возможности ведения журнала, попытаться перенаправить вывод отладки в файл и включить вывод отладки Qt, поскольку я рекомендую вариант QT_DEBUG_PLUGINS=1.   -  person maxik    schedule 28.06.2016
comment
@maxik, когда я заменяю Qapplication на QCoreapplication, он работает, но моему приложению на самом деле нужен Qapplication, потому что у меня много графического интерфейса и виджетов. Я установил QT_DEBUG_PLUGINS=1, где я могу найти информацию журнала, я не эксперт в среде QT.   -  person Waleed A    schedule 28.06.2016
comment
В том-то и дело, извините за зависание. ;) Зачем вашему демону нужен пользовательский интерфейс? QCoreApplication — это QApplication без пользовательского интерфейса (который на самом деле добавляет некоторые виджеты). Демон, по определению, не должен нуждаться в интерфейсе, не так ли? Таким образом, проблема, похоже, заключается в запросе на отображение некоторых вещей, которые демону не разрешено делать. Придерживайтесь QCoreApplication.   -  person maxik    schedule 28.06.2016