2012-06-24 61 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了自己。 (我刪除了所有的套接字代碼,所以它更容易閱讀

我的問題是,每次有新的連接進來(並且新的fork()被調用)時,fprintf似乎再次被調用,並且有一個新的。"Opened log file..."在我的日誌

爲什麼會發生這種情況

回答

6

叉完全複製的過程 - 包括fprintf中使用的緩衝器需要叉前右刷新文件句柄,以便您的分叉過程與IO開始。緩衝區清除:

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

好的,謝謝!但是在fprintf()完成之後不應該清除緩衝區嗎? – Zulakis

+1

有時是的,有時沒有。我相信stderr會在每一個換行符後自動刷新。但大多數流不會。 –

+0

(這是一件好事,因爲大多數時候你想緩衝,因爲它通過減少所需的系統調用次數來提高性能) –