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("/") - впрочем, это зависит от
конкретной проблемы.
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;
}
Кстати можно вопросик ?
Я где-то читал, что в BSD результатов аналогичных вызову setsid(),
нужно добиватся гораздо более геморройным способом.
Поправте меня, если я ошибаюсь.
>Я где-то читал, что в BSD результатов аналогичных вызову setsid(),
нужно добиватся гораздо более геморройным способом.
IMHO ты путаешь setsid() и setpgid().
В BSD, действительно, есть некий гемморой с setpgrp() и setpgid(),
позволяющий более тонко управлять группами и сессиями, но setsid()
все покрывает и полностью портабильна (в рассматриваемом контексте)
BSD <-> SysV <-> POSIX.1