Всем привет. Подскажите как правильно реализовать перенаправление потока вывода для демона (создаем новый процесс и отвязывает от терминала. stdout бы в файл, м?)Кусок кода демонизации и перенаправления.
int pid = fork();
switch(pid)
{
case -1:
printf("fork error");
exit(-11);
break;
case 0:
setsid();
chdir("/");
int stdoutO;
stdoutO = dup(fileno(stdout));
close(0);
close(1);
close(2);
memset(&sa, 0, sizeof(sa));
sa.sa_handler = &wc_sighandler;
sigaction(SIGCHLD, &sa, 0);
/* - Redirectind stdout - *///stdout = fopen(OutputFile,"w+");
stdout = freopen(OutputFile, "w+", stdout);
printf("..:[Demonization start. See log file: %s]:..\n", OutputFile);
...
printf("..:[Demonization stop. See log file: %s]:..\n", OutputFile);
/* - Free stdout - *///fflush(stdout);
//fclose(stdout);
//stdout = fdopen(stdoutO,"w");break;
default:
printf("..:[Demonization start... See log file: %s]:..\n", OutputFile);
//exit(0);
break;
}Файл создается пустой. Причем есть эту хрень откомпилить и запустить под eclipse - все работает. Из консоли - нет
ну что за стиль, блин. полная каша из системных вызовов и ф-й stdio.
если до демонизации ничего в stdout не выводилось, то stdio вообще необязательно знать что-либо о происходящем перенаправлении. все делается на уровне syscall'ов#ifdef выводилось_че_нть_printfами_до_этого
fflush(stdout);
#endif
close(0);
close(1);
close(2);
fd=open("my_file",O_RDWR);
dup2(fd,1);
close(fd);"старый стиль" (для юниксов не поддерживающих dup2 syscall):
#ifdef выводилось_че_нть_printfами_до_этого
fflush(stdout);
#endif
fd=open("my_file",O_RDWR); // написал O_RDWR глядя на ваше "w+". а нафига стдауту чтение???
close(1);
dup(fd);
close(fd);
close(0);
close(2);
\^P^/