URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1278
[ Назад ]

Исходное сообщение
"еще вопрос про daemon's и взаимодействие"

Отправлено vvk , 16-Янв-03 11:18 
спасибо за ответы на мой предыдущий вопрос. вот еще возникло.
есть я так понимаю много разных методов IPC.
мне надо вот что: daemon запущен, и крутиться себе там, выполняет свою работу. хочу сделать так, чтобы с командной строки я мог передать ему какую то команду ( начать работу, приостановить работу, задать параметры).
Пока есть идея написать программу, которая будет принимать параметр командной строки, и через IPC передавать daemon-у. Но я посмотрел некоторые виды IPC, и там получается, что для взаимодействия должен висеть цикл приема сообщений. но мне это не очень подходит, так как daemon должен иметь цикл для выполнения периодических операций.
Так вопросы такие:
1. какие виды IPC можно применить, чтобы не блокировать основной процесс
2. могу ли я использовать сигналы для взаимодействия с daemon-ом ?
3. как управляющая программа определит, какому daemon-у передавать данные.

Содержание

Сообщения в этом обсуждении
"RE: еще вопрос про daemon's и взаимодействие"
Отправлено Bob , 17-Янв-03 01:05 
Я уже делал похожую программу, поэтому давай опишу тебе кратко ее алгоритм. Надеюсь, это поможет тебе разобраться с проблемой.

Итак, у меня основной процесс запускает дочерний и тот становиться демоном:

    ...

    pid=fork();
    if (pid==0) {
        setsid();
        start_daemon();
        exit(1);
    }

    ...

Основной процесс сохраняет в отдельном файле pid потомка.

В функции start_daemon() перехватываются все сигналы и запускается на выполнение основной цикл. Его задача - непрерывное накопление и обработка данных (в моем случае это данные о сетевом трафике).
Для двух (SIGINT и SIGUSR1) определены новые обработчики.
При поступлении SIGINT демон завершает выполнение, по сигналу SIGUSR1 осуществляется считывание данных. Сама функция имеет приблизительно такой вид:

void start_daemon ()
{

/*Перехватываем сигналы*/
/*Запускаем бесконечный цикл*/

    loop();

/*Сюда мы не попадем. Но нам сюда и не надо !*/
    exit(0);
}

Теперь демон после запуска заходит в цикл и спокойно в нем работает до прихода сигнала SIGINT. Переменные, с которыми имеет дело цикл, определены как глобальные.

При запуске основного модуля в командной строке задается режим работы - старт демона, его остановка или считывание данных. Для режима "Старт" все понятно, только что его рассмотрели. Если задан режим остановки, считывается pid демона и ему посылается сигнал SIGINT:

    kill(pid, SIGINT);

Сам обработчик этого сигнала прост до безобразия:

void stop_daemon() {
    exit(1);
}
После этого выполнение демона завершается.

Если задан режим считывания данных, демону посылается сигнал SIGUSR1. Функция-обработчик этого сигнала считывает значение глобальной переменной (у меня это структура), с которой работал цикл loop(), и сбрасывает результат в отдельный файл.


"RE: еще вопрос про daemon's и взаимодействие"
Отправлено vvk , 18-Янв-03 20:35 
вот это да....
СПАСИБО ОГРОМНОЕ!

единственно у меня тоже появлялась мысль сохранить pid в файле. но
побоялся, что это не самый корректный способ и есть другие супер
дупер способы взаимодействий.

вот теперь с отловом кликов под иксами сделать и все будет пучком :)