昨天我想知道为什么堆上的alloc和frees数量不断上升: 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条目,堆上的alloc(由Valgrind报告)就会不断增加。还释放了alloc,但是alloc的总数不断增加,因此分配的内存的大小也在增加。恕我直言,这迟早会导致服务器耗尽内存。
我的问题是:为什么写入syslog会导致allocs增加。我很好地关闭了syslog。第一个syslog对堆分配没有影响。当我离开开放和关闭到第二次写入系统日志并留下实际写入注释掉一切都没关系。一旦我取消注释一个或两个系统日志行,就会开始爬行。
我必须监督明显的事情。
答案 0 :(得分:1)
如果消息大于其本地缓冲区,syslog
调用将分配内存以在发送之前保留日志消息。
它实际写入FILE *
,该open_memstream
是通过调用{{1}}创建的,{{1}}是一个C文件流,它实际上使用了根据需要自动增长的缓冲区。然后它接收缓冲区并将其内容发送到记录器。
来源为here。