Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в log-фаил 
:(
    Опции темы
Elyad
Дата 24.10.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Следующая программа делает процесс - демоном, и записывает в log-фаил некоторые сообщения.
В файле я прописал, что все сообщения локального уровня LOG_LOCAL2 будут записываться в фаил /var/log/dem.log. 
Проблема заключается в том, что когда я запускаю впервый раз, процесс записывает все в нужный log-фаил, но при последующих запусках  уже никаких записей не делается.
В чем же дело? 
void demon(const char *name)
{
    int i;
    pid_t pid;

    if ((pid=fork()) < 0)  perror("demon ");
    else if (pid > 0) exit(0);

    setsid();
    signal(SIGHUP,SIG_IGN);
    if ((pid=fork()) < 0)  perror("demon 2");
    else if (pid > 0)  exit(0);

    chdir("/");
    umask(0);
}

int main(int argc, char **argv)
{
     demon(argv[0]);
     syslog(LOG_LOCAL2|LOG_INFO,"hello1");
     syslog(LOG_LOCAL2|LOG_INFO,"hello2");
     return 0;
}
                           
PM MAIL   Вверх
MAKCim
Дата 24.10.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Elyad
проблема тут
Код

void demon(const char *name)
{
    int i;
    pid_t pid;

    if ((pid=fork()) < 0)  perror("demon ");
    else if (pid > 0) exit(0); /* Вот из-за этого syslog и не вызовется */

    setsid();
    signal(SIGHUP,SIG_IGN);
    if ((pid=fork()) < 0)  perror("demon 2");
    else if (pid > 0)  exit(0);    /* Процесс, пораждающий демона завершается, т. е сам демон 1 завершается??? Зачем? */

    chdir("/");
    umask(0);
}

int main(int argc, char **argv)
{
     demon(argv[0]); /* Из этой функции никогда не выходим поскольку (см. выше) */
     syslog(LOG_LOCAL2|LOG_INFO,"hello1");
     syslog(LOG_LOCAL2|LOG_INFO,"hello2");
     return 0;
}


Это сообщение отредактировал(а) MAKCim - 24.10.2006, 17:13


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Elyad
Дата 25.10.2006, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Хочу разъяснить всем этот код
void demon(const char *name)
{
    int i;
    pid_t pid;

    if ((pid=fork()) < 0)  perror("demon ");
    else if (pid > 0) exit(0); // завершение работы родительского процесса
    //первый дочерний процесс продолжает работу
   
     setsid();    // становится главным в сеансе
   // второй дочерний процесс продолжает работу
   //НАЗНАЧЕНИЕ второй функции fork - гарантировать, что демон не сможет
   // автоматически получить управляющий терминал, если потом он откроет устройство терминала.
   
    signal(SIGHUP,SIG_IGN);
    if ((pid=fork()) < 0)  perror("demon 2");
    else if (pid > 0)  exit(0);
   // изменение рабочего каталога
    chdir("/");
    umask(0);
}

И напоследок: протестировав эту прогу на FreeBSD оказалось, что все работает нормально и никаких проблем с демоном не возникает. smile 
Но при тестировании на Linux - проблема выше описанная... smile  
PM MAIL   Вверх
MAKCim
Дата 25.10.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

/ второй дочерний процесс продолжает работу
   //НАЗНАЧЕНИЕ второй функции fork - гарантировать, что демон не сможет
   // автоматически получить управляющий терминал, если потом он откроет устройство терминала.

setsid - создает новую сессию, новую группу процессов с одним процессов в этой группе - лидером группы процессов, отключается. Этот сеанс не будет иметь управляющего терминала
Каким образом связан fork с гарантией невозможности получить управляющий терминал??


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Elyad
Дата 25.10.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Не будем спорить по поводу моего демона, которым я уже пользуюсь год. Проблема то заключается в ом, что под FreeBSD код работает, а под Linux - НЕТ!!! smile  
PM MAIL   Вверх
Бонифаций
Дата 25.10.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



в линуксе в unistd.h есть специальная функция  int daemon(int nochdir, int noclose); которая и делает процесс демоном. 



--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Elyad
Дата 25.10.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Я хочу, чтобы прога работала и под  Linux и под FreeBSD. smile 
PM MAIL   Вверх
bsa
Дата 25.10.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



условную компиляцию еще никто не отменял. smile
PM   Вверх
Бонифаций
Дата 26.10.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



Цитата(Elyad @ 25.10.2006,  15:48)
Я хочу, чтобы прога работала и под  Linux и под FreeBSD. smile

судя по манам freebsd она присутсвует и там. В stdlib

HISTORY
The daemon ();
function first appeared in BSD 4.4


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Elyad
Дата 26.10.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Я все же хочу использовать своего демона и понять где именно в моей функции проблемы. Иведь под FreeBSD все работает нормально!!! smile 
PM MAIL   Вверх
Бонифаций
Дата 26.10.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



Странно все это. Я попробовал странслировать у себя на линуксе ваш код и 3 раза запустить. Каждый раз отработался нормально:

Oct 26 16:31:39 walrus-desktop test: hello1
Oct 26 16:31:39 walrus-desktop test: hello2
Oct 26 16:32:07 walrus-desktop test: hello1
Oct 26 16:32:07 walrus-desktop test: hello2
Oct 26 16:32:21 walrus-desktop test: hello1
Oct 26 16:32:21 walrus-desktop test: hello2

у меня gcc version 4.0.3 , Ubuntu 6.06.

Это сообщение отредактировал(а) Бонифаций - 26.10.2006, 15:37


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Elyad
Дата 27.10.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Спасибо за проявленный интерес к моей теме. Бонифаций, не подскажите ли вы мне какую же все таки функцию - моего демона или daemon использовать??? smile 
PM MAIL   Вверх
Бонифаций
Дата 27.10.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



я обычно daemon использую. попробуйте и Вы. тем более что там переделок совсем мало получится.



--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.