昨天我想知道为什么堆上的分配和释放的数量一直在攀升: Valgrind 理解堆摘要中分配的字节数增加?
今天我找到了罪魁祸首,但我不明白为什么:
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 */
}
一旦我取消注释这两个系统日志条目,堆上的分配(由 Valgrind 报告)就会不断增加。allocs 也被释放,但是 allocs 的总数不断增加,因此分配的内存的大小。恕我直言,这迟早会导致服务器用完内存。
我的问题是:为什么写入系统日志会导致分配增加。我很好地关闭了系统日志。第一个 syslog 对堆分配没有影响。当我为第二次写入系统日志而将打开和关闭位置保留并留下实际写入注释时,一切都很好。一旦我取消注释一两行 syslog 行,allocs 就会开始爬升。
我一定在监督一些明显的事情。