LINUX.ORG.RU

Если имеется в виду daemon, то там и писать то нечего. 1. Форкаемся (if(fork()==0)) и в родителе делаем exit

2. В дочернем закрываем дискирипторы 0,1,2 (close(0);close(1);close(2);)

3. Вызываем setsid()

И вот мы уже в режиме daemon'a

...В конце дочернего exit

И все

Dead ★★★★
()

afair, неплохой пример демона есть в "Advanced Linux Programming"

ananas ★★★★★
()
Ответ на: комментарий от Dead

Dead все правильно написАл, так и делай. Пара замечаний:

Вместо close(0);close(1);close(2); я бы сделал так:
close(0);open("/dev/null",O_RDONLY);
close(1);open("/dev/null",O_WRONLY);
close(2);dup(1);
Иначе, если твой демон стартанет что-либо, пишущее/читающее в стандартные потоки,
оно просто свалится.

Если будешь открывать какой-либо девайс для логов, то открывай его с флагом
O_NOCTTY

После setsid() неплохо бы сделать нечто chdir("/") - впрочем, это зависит от
конкретной проблемы.

Есть еще тонкости, посмотри e.g.
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16

Под Линухом есть готовая БСДишная функция daemon() (man daemon), но она не
шибко портабильна.

Die-Hard ★★★★★
()

2 Die-Hard Ты хочешь сказать, если я в демоне вызову ptintf, то он свалится?

Вроде как не валится.

Dead ★★★★
()
Ответ на: комментарий от Dead

Dead (*) (2002-11-07 17:08:32.73):
> 2 Die-Hard Ты хочешь сказать, если я в демоне вызову ptintf, то он свалится? 
> Вроде как не валится.

Ну, не точно выразился. Ничего не свалится, если ексепшены правильно обрабатывать.

printf вернет ошибку, и то не всегда (в частности, под Линухом он не замечает,
если соотв. дескриптор закрыт). Но большинство программ полагаются на то, 
что первые три дескриптора открыты  и 0 блокирует. Поэтому есть риск того, 
что достаточно продвинутая прога, стартанутая демоном, закрывшим дескрипторы,
упадет.

Другая опасность: прога пишет в инфу в файлы, которе сама и открывает, 
а алерты кидает на stderr, типа как под gtk/Qt бывает. Как ты думаешь, 
куда алерты попадут? - правильно, в открытый третьим по счету файл.

Спробуй, весьма поучительно:
#include <stdio.h>

int main (void)
{
int i;
FILE *one,*two,*three;
   close(0);
   close(1);
   close(2);

   one=fopen("one","w+");
   two=fopen("two","w+");
   three=fopen("three","w+");

   for(i=0;i<1000;i++){
      fprintf(stderr, "ono=%d\n",printf("%d\n",i));
      fprintf(two,"two %d\n",i);
      fprintf(three,"three %d\n",i);
   }
   return 0;
}

Die-Hard ★★★★★
()

Можно даже не пробовать, и так ясно что получится. :)

open открывает первый свободный дескриптор, этим все сказано.

Dead ★★★★
()

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

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (2002-11-08 09:23:21.898):

>Я где-то читал, что в BSD результатов аналогичных вызову setsid(), нужно добиватся гораздо более геморройным способом.

IMHO ты путаешь setsid() и setpgid(). В BSD, действительно, есть некий гемморой с setpgrp() и setpgid(), позволяющий более тонко управлять группами и сессиями, но setsid() все покрывает и полностью портабильна (в рассматриваемом контексте) BSD <-> SysV <-> POSIX.1

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.