2012-06-24 43 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

(这是一件好事,因为大多数时候你想缓冲,因为它通过减少所需的系统调用次数来提高性能) –