昨天我在想,爲什麼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就會開始爬行。
我必須監督一些顯而易見的事情。
刪除'fork'並檢查內存是否增加。 – aayoubi 2012-07-31 09:27:54
這不是叉子,而是對系統日誌的調用。只要我取消註釋兩個系統日誌消息中的任何一個,內存開始增加。我不明白爲什麼它會發生在較低的系統日誌調用中,而不是上一個? – lleto 2012-07-31 09:37:52