2012-06-24 2 views
2

Мой код выглядит как-то так:вилка пишет указатель_на_файл снова

//INCLUDES 

FILE *file; 

void handlesocket(int socket); 
int main(int argc, char *argv[]) 
{ 
    openlog("daemon", LOG_PID, LOG_USER); 
    syslog(LOG_INFO, "daemon started."); 
    file = fopen("/var/log/daemon.log","a+"); 
    fprintf(file,"Opened log file..."); 

    while (1) { 
     pid = fork(); 
     if (pid == 0) { 
      handlesocket(socket); 
      exit(0); 
     } 
     else close(socket); 
    } 
} 

void handlesocket(int socket) 
{ 
//handle socket 
} 

В основном, это ждет нового подключения, а затем сам Сервер порождает. (Я удалил весь код сокета, чтобы его было легче читать.

Моя проблема в том, что каждый раз, когда появляется новое соединение (и вызывается новый fork()), fprintf, похоже, снова вызван, и есть новый . "Opened log file..." в моем журнале

Почему это происходит

ответ

6

вилка полностью дублирует процесс - в том числе буферов, используемых fprintf Вы должны очистить дескриптор файла прямо перед вилкой, чтобы ваш раздвоенный процесс начинается с гипергликемии. буферы очищены:

fprintf(file, "opening log file\n"); 
fflush(file); 
+0

Хорошо, спасибо! Но разве буферы не очищаются после завершения fprintf()? – Zulakis

+1

Иногда да иногда нет. Я считаю, stderr будет автоматически очищаться после каждой новой строки. Но большинство потоков не будет. –

+0

(что хорошо, поскольку большую часть времени вы хотите буферизировать, так как это повышает производительность за счет сокращения количества необходимых системных вызовов) –