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..."我的日志中有一个新的连接。

为什么会这样?

4

1 回答 1

6

Fork 完全复制了这个过程——包括 fprintf 使用的缓冲区。您需要在 fork 之前刷新文件句柄,以便您的 fork 进程以 io buffers clear 开始:

fprintf( file, "opening log file\n" );
fflush( file );
于 2012-06-24T21:42:47.683 回答