c - 没有 malloc 时发生内存泄漏

标签 c linux memory-management memory-leaks

我编写了一个程序,但是我发现它存在内存泄漏,并且经过几次迭代后它出现段错误。我不明白这个内存泄漏在哪里。

下面是完整的代码片段。我知道代码存在一些常规错误,例如全局分配和创建比需要的大得多的缓冲区。我只是看不到泄漏的根源。

提前致谢。

#include <stdlib.h>
#include <stdio.h>

#define DATA 1000
#define TRUE 1
#define FALSE 0
const int16_t TIME = 600; // Time in seconds.
const int8_t DEBUG = 0;
// Globals Because I'm lazy!
long int cpua[5];
long int cpub[5];
long int mema[2];
long int nets[2];
long int netr[2];
int k=0;
char ch[150];
FILE *file_read;
char buffer[DATA];

void CPUread(void){
    file_read = popen("cat /proc/stat | grep \"cpu \"","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%s %ld %ld %ld %ld %ld",&ch[0],&cpua[0],&cpua[1],&cpua[2],&cpua[3],&cpua[4]);

    // Time to read the network..
    file_read = popen("ifconfig | grep -m 1 \"RX bytes:\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&netr[0]);
    file_read = popen("ifconfig | grep -m 1 \"RX bytes:\" | awk -F \"[^0-9]*\" '{ print $5 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&nets[0]);

    // Time to read memory
    file_read = popen("cat /proc/meminfo | grep -m 1 \"MemFree\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&mema[0]);

    file_read = popen("cat /proc/meminfo | grep -m 1 \"MemTotal\" | awk -F \"[^0-9]*\" '{ print $2 }'","r");
    fgets(buffer, DATA, file_read);
    sscanf(buffer,"%ld",&mema[1]);
}


void main(void){
    FILE *file_write, *fp;
    int i;
    long int total=0, ptotal=0;
    int valid = FALSE;
    char charbuf[100];
    file_write=popen("echo -n \"/var/www/dir/`date +%Y-%b-%d`.csv\"","r");
    fgets(charbuf,100, file_write);
    while(1){
        // Open up the status file container and read from the system.
        if(valid == FALSE ){

            CPUread();
            // Need to make a new file here.... With Date code.
            fp=fopen(charbuf,"a");
            if ( fp == NULL){
                perror("Dummy Spit In initial File create!\n");
                exit(-1);
            }
            fprintf(fp,"CPU,IOwait,Memory,KB_up,KB_down\n");
            if(DEBUG) printf("CPU,IOwait,Memory,KB_up,KB_down\n");
            valid = TRUE;
            fclose(fp);
        }else{
            for(i=0;i<5;i++) cpub[i] = cpua[i];
            nets[1]=nets[0];
            netr[1]=netr[0];
            CPUread();

            total = 0;
            for(i=0;i<5;i++){
                cpub[i]=cpua[i]-cpub[i];
                total+=cpub[i];
            }
            // Time to find the CPU useage and IO waits...
            fp=fopen(charbuf,"a");
            if ( fp == NULL){
                perror("Dummy Spit Trying to open file\n");
                exit(-1);
            }
            fprintf(fp,"%0.2f,%0.2f,%0.2f,%ld,%ld\n",(((float)cpub[0])/total)*100,(((float)cpub[4]/total)*100),((((float)mema[1]-(float)mema[0])/(float)mema[1]))*100,(nets[0]-nets[1])/1024,(netr[0]-netr[1])/1024);
            if(DEBUG) printf("%0.2f,%0.2f,%0.2f,%ld,%ld\n",(((float)cpub[0])/total)*100,(((float)cpub[4]/total)*100),((((float)mema[1]-(float)mema[0])/(float)mema[1]))*100,(nets[0]-nets[1])/1024,(netr[0]-netr[1])/1024);
            fclose(fp);
        }
    sleep(TIME);
    }
} 

最佳答案

我相信您需要在 CPUread() 函数中对从 popen() 返回的描述符调用 pclose() 。

请参阅此处的 popen() 文档:

popen() man page on die.net

我不确定这是否直接导致您的问题,但这绝对是资源泄漏。

关于c - 没有 malloc 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13634545/

相关文章:

c - if(varName) 和 if(varName!=NULL) 有什么区别?

c - 嵌入 list 文件以使用 mingw32 要求管理员执行级别

linux - wget 另一个服务器文件夹中的最新文件

c++ - bind shared_from_this 内存不会被释放

java - ThreadMXBean#getThreadAllocatedBytes 会返回分配的内存或对象的大小吗?

python - 为什么发送连续的 UDP 消息会导致消息延迟到达?

c - 如何删除多次出现的字符并只留下一个

c - 如何将 unsigned long long 转换为 double

在Linux中将物理地址转换为虚拟地址并读取其内容

objective-c - 是什么增加了对象的保留计数?