LINUX.ORG.RU

[ликбез]C/С++ main loop

 


0

0

Изучаю C++. Ради практики пишу демона. Но не пойму, как организовать цикл для обработки внешних событий. for (;;) и прочие - как-то глупо (имхо). Посмотрел на glib, но с наскоку ничего не понял. Может, посоветуете книгу, или ещё что...? Платформа - GNU/Linux

А что тебя конкретно смущает? Основной цикл программы как правило занимается постоянным поллингом каких-то событий и запускает код обработки этих событий.

m0rph ★★★★★
()

Каких именно событий?

# Для сигналов
man 2 sigaction

# Для файловых дескрипторов (сокеты, файлы, устройства, куча служебных штук...)
man 2 select
man 2 poll
Deleted
()
Ответ на: комментарий от mannaz

Qt очень удобно, демон сейчас как раз на нём и написан; пытаюсь изобразить тоже самое, но без него. Ибо 10-15 мегабайт занимаемой памяти для демона - имхо многовато. Хотя, повторюсь, Qt - ну очень удобно.

Unnamed_Hero ★★★
() автор топика
Ответ на: комментарий от Unnamed_Hero

Вообще, демон занимается сбором статистики об обновлениях в репозитарии. Периодически запускает обновление списка пакетов, общается с библиотекой менеджера пакетов, берёт оттуда информацию о доступных и прочие полезности, а дальше через d-bus у него это это спрашиваю разными фронтендами.

Unnamed_Hero ★★★
() автор топика
Ответ на: комментарий от Unnamed_Hero

> Ибо 10-15 мегабайт занимаемой памяти для демона - имхо многовато

можно qt собрать в минимально необходимой конфигурации

lester ★★★★
()

for (;;) не так уж и плох, если внутри него select (или что-то аналогичное)
главное - как ты всё это дело организуешь, и чтобы это не жрало 100% ЦПУ.
а обернуть это можешь хоть в while(9000)

xydo ★★
()
Ответ на: комментарий от tia

Да, в принципе, использование что-то типа while (1) {sleep (1); do_something();} самое распространённое.

осталось разобраться в кромешных дебрях glib, dbus и libxml.

Unnamed_Hero ★★★
() автор топика
Ответ на: комментарий от Unnamed_Hero

Конструкции вроде

while (1) { sleep(1); }

не стоит использовать. Например, см. http://www.lesswatts.org/projects/applications-power-management/avoid-pulling...

В цикле надо делать не sleep(1), а блокирующее ожидание входящих событий (что и делает, например, glib main loop).

dmitry_vk ★★★
()
Ответ на: комментарий от xtron

>демон на qt? я знал что доживу до этого...

Мне нужно было на чём-то его сделать, Qt предоставил все инструменты в одном флаконе, причём отлично документированные. Сейчас я делаю попытку переписать его без использования Qt (ради повышения скиллов), но уже столкнулся с некоторыми проблемами - например, нет нормальных биндингов для dbus на С++. Скорее всего придётся использовать glib-dbus.

Unnamed_Hero ★★★
() автор топика
Ответ на: комментарий от dmitry_vk

Хм. Спасибо. Буду Копать в этом направлении. Две первые ссылки из гугля о написании демона как раз и сводились к использованию for (;;) и while & sleep

Unnamed_Hero ★★★
() автор топика
Ответ на: комментарий от xtron

Обожди, эти кудесники и на похапе демон напишут.

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