URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5872
[ Назад ]

Исходное сообщение
"Демонизация и потоки"

Отправлено Wiki , 04-Ноя-06 01:28 
Всем привет. Подскажите как правильно реализовать перенаправление потока вывода для демона (создаем новый процесс и отвязывает от терминала. 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 - все работает. Из консоли - нет


Содержание

Сообщения в этом обсуждении
"Демонизация и потоки"
Отправлено perece , 07-Ноя-06 20:36 
ну что за стиль, блин. полная каша из системных вызовов и ф-й 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^/