Я уже делал похожую программу, поэтому давай опишу тебе кратко ее алгоритм. Надеюсь, это поможет тебе разобраться с проблемой.
Итак, у меня основной процесс запускает дочерний и тот становиться демоном:
...
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(), и сбрасывает результат в отдельный файл.