2012-07-31 45 views
3

昨天我在想,爲什麼allocs的堆上的數量和釋放保持攀升: Valgrind understanding bytes allocated increase in heap summary?寫入系統日誌導致堆分配的大小穩步增加

今天,我已經找到了罪魁禍首,但我不明白原因:

openlog ("XYSV", LOG_PID, LOG_SYSLOG); 
syslog (LOG_NOTICE, "server started by %s(%d) on port %d", getenv("USER"),getuid(),servPort); 
closelog(); 

for (;;) /* Run forever */ 
{ 
    clntSock = AcceptTCPConnection(servSock); 
    char ipstr[INET6_ADDRSTRLEN]; 

    /* Fork child process and report any errors */ 
    if ((processID = fork()) < 0) 
     DieWithError("fork() failed"); 
    else if (processID == 0) /* If this is the child process */ 
    { 
     close(servSock); /* Child closes parent socket */ 
     HandleTCPClient(clntSock); 

     exit(0);   /* Child process terminates */ 
    } 

    openlog ("XYSV", LOG_PID, LOG_SYSLOG); 
    //syslog(LOG_INFO,"%d : created new child process for connect from %s\n", (int) processID,ipstr); 
    //syslog(LOG_INFO, "test"); 
    closelog(); 

    close(clntSock);  /* Parent closes child socket descriptor */ 
    childProcCount++;  /* Increment number of outstanding child processes */  
} 

只要我取消註釋兩個syslog條目,堆上的分配(由Valgrind報告)就會不斷增加。分配也被釋放,但分配的總數不斷增加,因此分配的內存的大小。恕我直言,這遲早會導致服務器耗盡內存。

我的問題是:爲什麼這會寫入系統日誌導致分配增加。我很好地關閉了syslog。第一個syslog對堆分配沒有影響。當我離開第二次寫入系統日誌的開啓和關閉時,並且將實際的寫入註釋掉,一切都很好。只要我取消一個或兩個syslog行的註釋,alloc就會開始爬行。

我必須監督一些顯而易見的事情。

+0

刪除'fork'並檢查內存是否增加。 – aayoubi 2012-07-31 09:27:54

+0

這不是叉子,而是對系統日誌的調用。只要我取消註釋兩個系統日誌消息中的任何一個,內存開始增加。我不明白爲什麼它會發生在較低的系統日誌調用中,而不是上一個? – lleto 2012-07-31 09:37:52

回答

1

如果消息大於其本地緩衝區,syslog調用將分配內存以在傳送日誌消息之前保存日誌消息。

它實際上寫入到FILE *,該FILE *是通過調用open_memstream創建的,該文件是實際使用根據需要自動生長的緩衝區的C文件流。然後它獲取緩衝區並將其內容發送到記錄器。

來源是here

+1

謝謝,但應closelog不釋放緩衝區?我發送的消息很短(「測試」),並且在實際寫入之後調用closelog()。 – lleto 2012-07-31 10:04:55

+0

@lleto:你的valgrind輸出已經顯示所有的分配都通過釋放來匹配。我以爲你在問爲什麼分配數量增加。 – jxh 2012-07-31 14:22:53