Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: Inhibitor от Март 31, 2020, 21:27



Название: Ликвидировать демона
Отправлено: Inhibitor от Март 31, 2020, 21:27
Товарищи профессионалы, нужен совет.

Есть исходный код написанный под Linux, в котором задействован демон. Qt не используется. Задача стоит переписать данный код средствами Qt, дабы помимо пользователей Linux были так же осчастливлены многочисленные пользователи Венды. Подскажите, пожалуйста, в каком направлении копать?

Спасибо!


Название: Re: Ликвидировать демона
Отправлено: qate от Март 31, 2020, 22:38
сути проблемы не уловил и что значит "задействован демон" ?


Название: Re: Ликвидировать демона
Отправлено: Inhibitor от Март 31, 2020, 22:55
сути проблемы не уловил и что значит "задействован демон" ?

В main.cpp первым делом создается демон через стандартную процедуру: fork(), umask(), setsid() и так далее...


Название: Re: Ликвидировать демона
Отправлено: sergek от Апрель 01, 2020, 08:32
Посмотрите в сторону QtService.


Название: Re: Ликвидировать демона
Отправлено: ssoft от Апрель 01, 2020, 08:34
Посмотрите в сторону Qt Service (https://github.com/qtproject/qt-solutions/tree/master/qtservice)


Название: Re: Ликвидировать демона
Отправлено: ssoft от Апрель 01, 2020, 08:35
Посмотрите в сторону QtService.
Как синхронно получилось))


Название: Re: Ликвидировать демона
Отправлено: sergek от Апрель 01, 2020, 10:06
штампы, что поделаешь))


Название: Re: Ликвидировать демона
Отправлено: qate от Апрель 01, 2020, 18:28
В main.cpp первым делом создается демон через стандартную процедуру: fork(), umask(), setsid() и так далее...

так убрать их не  ?


Название: Re: Ликвидировать демона
Отправлено: DarkHobbit от Апрель 02, 2020, 12:15
Посмотрите в сторону QtService.
Интересная вещь, спасибо.
А он вообще поддерживаемый? Я смотрю, последний коммит был 4 года назад. Да и статус всего проекта qt-solutions вызывает интерес. Я так понял, это набор библиотек от разработчиков Qt, но при этом в саму Qt не входящих?..


Название: По теме автора
Отправлено: DarkHobbit от Апрель 02, 2020, 12:30
Есть исходный код написанный под Linux, в котором задействован демон. Qt не используется. Задача стоит переписать данный код средствами Qt, дабы помимо пользователей Linux были так же осчастливлены многочисленные пользователи Венды.

Я бы, кстати, задался вопросом: а нужна ли в таком серверном проекте вообще Qt, и не решаема ли задача средствами "чистого" современного C++ (возможно, с привлечением Boost, в частности, Boost.Asio, но и STL сейчас очень сильно подрос)?

Если что, я не настаиваю, что этот вопрос имеет однозначное решение. У QtCore до сих пор есть сильные "плюшки", например, ЧЕЛОВЕЧЕСКАЯ поддержка строк с юникодом и вообще перекодировками. А вот QtNetwork vs Boost и вообще зрелость сетевого стека в Qt --- тема очень-очень отдельного флейма (вот, например, страшная история с другого форума (http://www.forum.crossplatform.ru/index.php?showtopic=10976)).

Решать Вам, конечно. Мне, кстати, интересно, что же Вы в итоге решите.


Название: Re: Ликвидировать демона
Отправлено: Авварон от Апрель 02, 2020, 13:46
QtNetwork оно об удобстве а не о производительности. Там внутре вообще select() испльзуется => проблему 10к на кутешных сокетах не решить.
АСИО я не трогал лет 6 но и тогда оно тоже недалеко ушло от кутешных сокетов - там внутри все было "поперчено" мьютексами которые безбожно тормозили.
Возможно за 6 лет что-то и поменялось в лучшую сторону но я бы смотрел на голый epoll или тонкие обертки над ним и аналогами


Название: Re: Ликвидировать демона
Отправлено: Inhibitor от Апрель 02, 2020, 17:16
так убрать их не  ?

Ну как бэ да  ::) Точнее не убрать, а написать в Qt реализацию годную для обоих платформ.

Посмотрите в сторону QtService.

Посмотрел. Товарищ DarkHobbit озвучил мои опасения. Это про коммит четырехлетней давности. Так что пока в раздумиях...

Я бы, кстати, задался вопросом: а нужна ли в таком серверном проекте вообще Qt, и не решаема ли задача средствами "чистого" современного C++ (возможно, с привлечением Boost, в частности, Boost.Asio, но и STL сейчас очень сильно подрос)?

Увы, это не чисто серверное приложение, GUI там присутствует в достаточном количестве. А ваять вменяемый GUI без Qt мы уже не умеем ;D (Давеча листал код с MFC  :o   God bless the Qt!  :D)


Название: Re: По теме автора
Отправлено: qate от Апрель 02, 2020, 18:01
А вот QtNetwork vs Boost и вообще зрелость сетевого стека в Qt --- тема очень-очень отдельного флейма (вот, например, страшная история с другого форума (http://www.forum.crossplatform.ru/index.php?showtopic=10976)).

а можно ли подробнее про недостатки QtNetwork vs Boost  ?

на том форуме нет кода, хз что там ТС еще делал, и версия qt старая


Название: Re: Ликвидировать демона
Отправлено: qate от Апрель 02, 2020, 18:03
Там внутре вообще select() испльзуется => проблему 10к на кутешных сокетах не решить.

была проблема 1024 сокетов, ее решили после 5.6


Название: Re: Ликвидировать демона
Отправлено: qate от Апрель 02, 2020, 18:08
Точнее не убрать, а написать в Qt реализацию годную для обоих платформ.

если для linux это systemd или иное, то уже не две реализации  )


Название: Re: Ликвидировать демона
Отправлено: qate от Апрель 02, 2020, 18:16
могу предложить такое решение - писать программу без демонизации "как обычно", затем :
1. linux = https://askubuntu.com/questions/610017/running-a-command-in-screen-daemon-mode
2. windows = https://superuser.com/questions/643120/windows-powershell-screen-equivalent


Название: Re: Ликвидировать демона
Отправлено: Авварон от Апрель 02, 2020, 18:43
Там внутре вообще select() испльзуется => проблему 10к на кутешных сокетах не решить.

была проблема 1024 сокетов, ее решили после 5.6

Глянул в код, действительно, они иногда используют poll(), а иногда qt_poll (https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qpoll.cpp.html#_Z7qt_pollP6pollfdmPK8timespec), который использует select() ;D
Видимо, некоторым платформам не повезло.
Но всё равно, poll() тоже не является серебряной пулей и дескрипторы надо перебирать - алгоритмическая сложность O(N).
Я уж молчу что сокеты нельзя на тредпул раскидать.


Название: Re: Ликвидировать демона
Отправлено: kuzulis от Апрель 02, 2020, 19:24
Цитировать
Но всё равно, poll() тоже не является серебряной пулей и дескрипторы надо перебирать - алгоритмическая сложность O(N).
Я уж молчу что сокеты нельзя на тредпул раскидать.

А какие есть иные варианты?


Название: Re: Ликвидировать демона
Отправлено: Old от Апрель 02, 2020, 19:37
Но всё равно, poll() тоже не является серебряной пулей и дескрипторы надо перебирать - алгоритмическая сложность O(N).
Я уж молчу что сокеты нельзя на тредпул раскидать.
А вот asio использует epoll, легко раскидывает обработку на пул потов и мьютексы у него где надо, конечно если хотим на нескольких ядрах все крутить. А если не хотим, то флажочек указываем и он мьютексы все отключает. :)


Название: Re: Ликвидировать демона
Отправлено: DarkHobbit от Апрель 02, 2020, 19:59
Товарищ DarkHobbit озвучил мои опасения. Это про коммит четырехлетней давности. Так что пока в раздумиях...
(густо краснеет) Ну на самом деле, у меня бы это были не основные опасения. Тут нужно просто взять и проверить, насколько оно хорошо работает с актуальными (для вас) версиями Qt, на линуксе и на винде. Практика - критерий истины.

Вот с сетевой работой возможны более серьёзные (и не сразу выявляемые) грабли. Оно у вас планируется к работе 24/7 или только в течение рабочего дня?

Увы, это не чисто серверное приложение, GUI там присутствует в достаточном количестве.
Хм, тогда не очень понял, при чём тут демон. В комплексе несколько программ, одна работает как демон, остальные с GUI?


Название: Re: Ликвидировать демона
Отправлено: Авварон от Апрель 02, 2020, 23:52
Но всё равно, poll() тоже не является серебряной пулей и дескрипторы надо перебирать - алгоритмическая сложность O(N).
Я уж молчу что сокеты нельзя на тредпул раскидать.
А вот asio использует epoll, легко раскидывает обработку на пул потов и мьютексы у него где надо, конечно если хотим на нескольких ядрах все крутить. А если не хотим, то флажочек указываем и он мьютексы все отключает. :)


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


Название: Re: Ликвидировать демона
Отправлено: Old от Апрель 03, 2020, 09:53
Но ведь основная прелесть еполла что к дескриптору можно привязывать контекст и тем самым обеспечивать разделение по данным, то есть никакие мьютексы там нафик не нужны.
И asio использует эту возможность epoll.
Но, если мы говорим про пул потоков, то даже если мы сразу получили дескриптор сокета, событие и контекст, нам нужно впихнуть обработчик этого события в пул потоков, а это мьютекс + условная переменная.
  


Название: Re: Ликвидировать демона
Отправлено: Авварон от Апрель 03, 2020, 12:28
И asio использует эту возможность epoll.
Но, если мы говорим про пул потоков, то даже если мы сразу получили дескриптор сокета, событие и контекст, нам нужно впихнуть обработчик этого события в пул потоков, а это мьютекс + условная переменная.
  

Погодите, там что, еполл отдельно а пул отдельно?


Название: Re: Ликвидировать демона
Отправлено: Old от Апрель 03, 2020, 12:53
Погодите, там что, еполл отдельно а пул отдельно?
Отдельно от чего? :)
В asio есть io_context, это некотрый аналог QEventLoop, который можно запустить в 1 потоке, а можно и в 101.
Все сокеты/таймеры привязываются к этому контексту.
Вот как тут понять, отдельно или нет? :)

Но я говорил про решение без привязки в чему либо. Если у нас есть пул потоков, то у нас мьютекс. Да epoll нас избавляет от еще одного мьютекса на коллекцию сокет -> контекст.


Название: Re: Ликвидировать демона
Отправлено: Inhibitor от Апрель 04, 2020, 13:21
могу предложить такое решение - писать программу без демонизации "как обычно", затем :
...

Qate, спасибо за идею, попробую, наверное, Ваше предложение реализовать.

Оно у вас планируется к работе 24/7 или только в течение рабочего дня?

В течение рабочего дня. А иногда и того меньше.

Хм, тогда не очень понял, при чём тут демон. В комплексе несколько программ, одна работает как демон, остальные с GUI?

Основное приложение крутится как демон, настройка и управление этим приложением реализовано через GUI.


Название: Re: Ликвидировать демона
Отправлено: DarkHobbit от Апрель 14, 2020, 16:13
Основное приложение крутится как демон, настройка и управление этим приложением реализовано через GUI.
Ну тогда можно применение Qt ограничить именно управляющей программой, а основное приложение написать на чистом C++, возможно, с бустом. Но это не догма, это один из вариантов. Главное понимать, что вы хотите получить от Qt в "серверном" варианте.

А вот идея писать программу без демонизации, а потом пускать её под screen мне совсем не нравится. Это же костыль для ситуации, когда других вариантов нет. Я, например, OpenSimulator на VDS так пускал, и это, считаю, одна из причин, затрудняющих его распространение. Тем более, для винды и линукса костыли разные потребуются. :( Я бы всё-таки, если делать демона на Qt, потыкал бы сначала QtService.