Какой метод я использую для управления фоновым процессом для конкретного приложения?

Я разрабатываю приложение с различным поведением в зависимости от аргументов:

  • "- config" запускает окно Gtk для изменения параметров, запуска и закрытия демона.
  • «- daemon» запускает фоновый процесс, который делает что-то каждые X минут.

Я уже знаю, как использовать fork / system / exec и т.д ...

Но я хотел бы знать основную логику такого приложения:

  • перезапустите или обновите демон при изменении конфигурации.
  • хранят только один экземпляр демона.

Я читал, что убить демона, чтобы перезапустить его, не является чистым способом.
Как работают другие приложения? (Ubuntuone, прогноз погоды, RSS-канал работает с областью уведомлений)

Спасибо за вашу помощь.

PS: я не хочу создавать общесистемный демон, просто пользовательское приложение с фоновым процессом.

2
задан 11 September 2012 в 18:58

2 ответа

Вы касаетесь здесь океана информации. Эта проблема называется межпроцессным взаимодействием (IPC), и существует множество материалов по этому вопросу, в зависимости от языка программирования, сложности и т. Д. Она варьируется от обмена данными по файлам (наличие или отсутствие файла блокировки - простой вариант это) через именованные каналы к Sys V IPC, включая семафоры и разделяемую память.

В твоем случае я бы посмотрел на именованные каналы.

0
ответ дан 11 September 2012 в 18:58

Подумайте о разгрузке уведомлений в систему!

Общим способом общения с демоном в современном настольном компьютере GNU / Linux является D-Bus . Чтобы существенно упростить то, что он делает: D-Bus позволяет вызывать функции из процесса «обслуживания» демона. Вы можете легко получить функцию refreshConfig(), которая перезагружает конфигурацию из файла при вызове.

Тем не менее, конкретная вещь, которую вы пытаетесь сделать, имеет более подходящее решение для Ubuntu и GTK +. С помощью GSettings вы создаете схему конфигурации, которая определяет пары ключ / значение, которые вы хотите хранить. Сделав это, вы можете поместить строку примерно в этот демон ...

mySettings->connect("changed::setting", onSettingChanged);

И GObject разбудит вашего демона и вызовет onSettingChanged() при изменении конфигурации. Эта функция может вызывать новый экземпляр себя и exit(0), если хотите. Хотя я не могу придумать причину кодовой логики, почему вам нужно это сделать.

Вот отличное руководство по использованию GSettings с Python . Он должен быть легко переведен на C ++.

0
ответ дан 11 September 2012 в 18:58

Другие вопросы по тегам:

Похожие вопросы: