Для родительского процесса:
if (fork()!=0)exit(0);
Для дочернего процесса:
setsid();
close(stdin);
close(stdout);
close(stderr);
chdir("/");
И ты уже в демоне. Дальше - тело демона.
Неточность.
Для close() используй 0,1,2 либо close() замени на fclose() для stdin,stdout,stderr.
По демонам что-то было в книге: Робачевский Андрей "Операционная система Unix" (если мне память не изменяет).
Посмотри может поможет:
...
void fn_setdaemon(const char * namelogFile);
void fn_server(void);
int main(int argc, char** argv)
{
const char * namelogFile = "/var/log/mydaemon.log";
if (fork() != 0)
{ _exit(0); }
// child_1
fn_setdaemon(namelogFile);
return 0;
} // main()
void fn_setdaemon(const char * namelogFile)
{
// child_1
// set glavn process
setsid();
if (fork() != 0)
{ _exit(0); }
// child_2
try
{
//iChildPid = getpid();
//printf("child: pid=%d \n", iChildPid);
//
chdir("/");
umask(0);
// ignor. signals
// close descriptors files
struct rlimit rlim;
getrlimit(RLIMIT_NOFILE, &rlim);
// закрываем все открытые дескрипторы
for (int fd=0; fd < rlim.rlim_max; fd++)
close(fd);
umask(0133);
// open "stdin"
stdin = fopen("/dev/null", "a+"); // = 0
if (stdin == NULL)
throw clError("error: stdin=fopen(\"/dev/null\")\n");
// open "stdout" = file_log
stdout = fopen(namelogFile, "a+"); // = 1
if (stdout == NULL)
throw clError("error: stdout=fopen(\"namelogFile\")\n");
// для того что бы ошибки писались
// в выходной поток,
// который сбрасываем в лог-файл.
// open "stderr"
stderr = stdout; // = 2
fflush(stdout);
fflush(stderr);
// START SERVER
fn_server();
fflush(stdout);
fflush(stderr);
fclose(stdin);
fclose(stdout);
fclose(stderr);
}
catch(clError & er)
{
printf("error: '%s' \n", er() );
}
catch(...)
{
printf("error: '...' \n");
}
} // fn_setdaemon()
void fn_server(void)
{
....
} // fn_server(void)
>По демонам что-то было в книге: Робачевский Андрей "Операционная система Unix"
>(если мне память не изменяет).
Там мало и не понятно но что-то можно найти.
Конкретные книжки:
У. Стивенс: Unix: Разработка сетевых приложений. -
красная книжка, Ульям, Разработка сетевых приложений под Linux
желтая автора не помню (Дуглас, Камер ??) TCP/IP вроде 3 том,
но точно не помню, там где программирование.
Там много интересного и в частности по созданию серверных приложений.
Есть примеры кода - в Internete.
Не в Инете, а на полках магазина. Слишком круто чтоб такие вещи
свободно распространять. За мозги всеж платить нужно.
В инете примеры к этим книгам.
В книгах этих указаны сайты, с которых можно скачать эти примеры.
по приаритетам для быстрого написания сервера:
1. красная + желтая(классика)
2. У.Стивенс - это классика
а можно и без книг, но нужно знать архитектуру OS.
Не Unix/Linux, а вообще,
+ TCP/IP и доступ через библиотеку Unix-API,
но книги только усилят и улучшат знания.