-7

プログラムを作成しましたが、メモリリークがあり、数回繰り返した後にセグメンテーション違反が発生することがわかりました。このメモリリークがどこにあるのかわかりません。

以下は、コード スニペット全体です。グローバル割り当てや、必要以上に大きなバッファの作成など、コードに従来のエラーがあることは承知しています。漏れの元が見えないだけです。

前もって感謝します。

#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);
    }
} 
4

3 に答える 3

2

CPUread() 関数で popen() から返された記述子で pclose() を呼び出す必要があると思います。

次の popen() ドキュメントを参照してください。

die.net の popen() man ページ

これがあなたの問題の直接の原因であるかどうかはわかりませんが、間違いなくリソース リークです。

于 2012-11-29T20:57:53.020 に答える
0

popen() はたくさんありますが、pclose() はありません...

于 2012-11-29T20:59:14.203 に答える
0

pclose() を使用する必要があるという事実は別として、問題が解決されたことを確認できるように、必ず valgrind を使用してプログラムを実行してください。

于 2012-11-29T21:08:23.090 に答える