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で使用されるバッファーを含め、プロセスを完全に複製します。フォークされたプロセスがiobuffersclearで開始されるように、フォークの直前にファイルハンドルをフラッシュする必要があります。

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