Ковырял несколько статей и примеров по созданию приложения-демона средствами языка Си. В целом суть понял. Нужно выполнить примерно несколько операторов:
fork();
setsid();
umask(0);
chdir("/");
close(0);
close(1);
close(2);
exit(0);
А дальше что и как правильно сделать, чтобы созданный демон оставался висеть в системе?
Перепробовал примеры и ни черта не понял. Не совсем понятные и разные объяснения.
Прошу тех, кто шарит в этой теме, скиньте какой-нибудь понятный пример с объяснением каждого шага работы программы.
C/C++
Как на Си правильно создать резидентную программу, то есть "демона"?
Привожу пример, который работает на Linux Fedora и на Android(Linux Debian). Тестил на своём телефоне с Android.
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<syslog.h>
int main(void)
{
pid_t pid, sid;
/*Создаем потомка от процесса: */
pid = fork();
if (pid < 0)
{
/*Если pid = -1, то потомок
не создан
*/
exit(EXIT_FAILURE);
}
/* Если pid>0, значит потомок
создан, поэтому завершаем
родительский процесс: */
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* Меняем маску доступа к файлам
от демона : */
umask(0);
/* Создаём новую сессию для демона,
в которой он лидер и единственный
процесс в своей группе: */
sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
/* Меняем рабочую папку демона,
если не будем ничего никуда выводить,
и если нужна гарантия работы процесса,
ибо корневая папка не отмонтируется
и не поменяется в процессе работы ОС, но здесь смена папки закоментена, так как мы будем создавать файл ls.txt, доступ для создания в корневой папке отсутствует для приложения юзера: */
/*if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
} */
/*Отключаемся от стандартного
ввода, вывода и реакции на ошибки, то есть отключаемся от терминала, чтобы он не управлял демоном: */
close(STDIN_FILENO); //выкл. ввод
close(STDOUT_FILENO);//выкл. вывод
close(STDERR_FILENO);//выкл. ошибки
/* Демон работает в бесконечном
не нагрузном цикле с паузой в теле
кода для снятия нагрузки на процессор: */
while (1)
{
/* Здесь код демона,
например, будем выполнять
каждые пол минуты команду
ls > ls.txt... : */
system("ls > ls.txt");
/*Пауза в теле демона обязательна,
иначе попусту нагружаем комп: */
sleep(30);
}
exit(EXIT_SUCCESS);
}

#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<syslog.h>
int main(void)
{
pid_t pid, sid;
/*Создаем потомка от процесса: */
pid = fork();
if (pid < 0)
{
/*Если pid = -1, то потомок
не создан
*/
exit(EXIT_FAILURE);
}
/* Если pid>0, значит потомок
создан, поэтому завершаем
родительский процесс: */
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* Меняем маску доступа к файлам
от демона : */
umask(0);
/* Создаём новую сессию для демона,
в которой он лидер и единственный
процесс в своей группе: */
sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
/* Меняем рабочую папку демона,
если не будем ничего никуда выводить,
и если нужна гарантия работы процесса,
ибо корневая папка не отмонтируется
и не поменяется в процессе работы ОС, но здесь смена папки закоментена, так как мы будем создавать файл ls.txt, доступ для создания в корневой папке отсутствует для приложения юзера: */
/*if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
} */
/*Отключаемся от стандартного
ввода, вывода и реакции на ошибки, то есть отключаемся от терминала, чтобы он не управлял демоном: */
close(STDIN_FILENO); //выкл. ввод
close(STDOUT_FILENO);//выкл. вывод
close(STDERR_FILENO);//выкл. ошибки
/* Демон работает в бесконечном
не нагрузном цикле с паузой в теле
кода для снятия нагрузки на процессор: */
while (1)
{
/* Здесь код демона,
например, будем выполнять
каждые пол минуты команду
ls > ls.txt... : */
system("ls > ls.txt");
/*Пауза в теле демона обязательна,
иначе попусту нагружаем комп: */
sleep(30);
}
exit(EXIT_SUCCESS);
}


Иван Семёнов
На скринах программа-демон c99
Нассы под дверь
хлопни в ладоши 6 раз
поспи
и утром под подушкой нечего не будем потомучто ещё не всё
попей воды
сьешь блинчик из какашки таноса
поспи
и все твои вопросы решатся
хлопни в ладоши 6 раз
поспи
и утром под подушкой нечего не будем потомучто ещё не всё
попей воды
сьешь блинчик из какашки таноса
поспи
и все твои вопросы решатся
демон в тебе сидит
Похожие вопросы
- Язык Си Составить ГСА и программу расчета значения R
- Проверьте пожалуйста правильно ли написана программа вопроса
- Написать программу на языке Си
- Программа на СИ. Циклы с постусловием и предусловием
- Помогите пожалуйста написать программу на Си
- Создать файл ABONENT.dat, содержащий записи следующей структуры: ФИО абонента; его номер телефона. на языке си++
- Написать программу на языке Си, которая решит эту задачу:
- Работа со структурами. Написать программу для СИ
- Помогите написать программу на СИ
- Чувствительны ли программы на Си к исправности железа