3

昨天我想知道为什么堆上的分配和释放的数量一直在攀升: 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 就会开始爬升。

我一定在监督一些明显的事情。

4

1 回答 1

1

syslog如果消息大于其本地缓冲区,则调用将分配内存以在传递日志消息之前保存它。

它实际上写入FILE *由调用创建的 a open_memstream,这是一个 C 文件流,它实际上使用了一个根据需要自动增长的缓冲区。然后它获取缓冲区并将其内容发送到记录器。

来源在这里

于 2012-07-31T09:43:36.357 回答