公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2009年3月24日星期二

OpenSource之获取某进程内存比,CPU比等

我下面实现的代码主要是对系统中squid进程监控的一个函数,这个函数主要实现的功能就是取得squid实时占系统内存的比率,并与函数传递进来的maxmem比较,如果小于它就返回0,反之,返回1。其中取得该进程的内存比主要是通过top或者ps等系统命令来实现的。

代码如下:
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//get squid memory scale
int squid_mem_info(int maxmem)
{
    FILE   *stream;
    char   buf[1024] = "";
    char   mem[32] = "";
    float  float_mem;
    float  float_maxmem;

    float_maxmem = (float)maxmem;
    memset( buf, '\0', sizeof(buf) );
    //stream = popen("./top -d 1 -o cpu |grep -r \"squid\" |awk '{print $9}'", "r" );
    stream = popen("ps acux|grep squid |grep -v \"0.00\" |awk '{print $4}'","r");  //通过ps取得squid占系统的内存比,上面注释的也可以,只需调整一下。
    fread( buf, sizeof(char), sizeof(buf),  stream);
    if(strlen(buf)==0){  //when squid is not run.
        float_mem = 0.1;
    }else{
        float_mem = atof(mem);
    }

    if(float_mem > float_maxmem){
        printf("float_mem > float_maxmem\n");
        return 1;
    }else{
        printf("float_mem <= float_maxmem\n");
        return 0;
    }

    pclose( stream );
}

int main( void )
{
    squid_mem_info(10);
    return 0;
}

运行结果:
float_mem <= float_maxmem

这段代码主要是告诉我们如何通过ps,top等命令取得某一进程系统的内存,CPU等信息。
下面一段代码告诉我们如何通过读取文件得到系统的一些信息,如系统总的内存,空闲内存,交换分区大小等等。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mem_scale(char *filename)
{
    char total[64]="";
    char free[64]="";
    char temp[64]="";
    char MemTotal[64]="";
    char MemFree[64]="";
    FILE *fp;
    int i, j;
    float k;

    if ((fp = fopen(filename, "r")) == NULL) {
        printf("cannot open outfile\n");
        exit(-1);
    }
    for (i = 0; i < 5; i++) {
        fgets(temp, 80, fp);
        if (i == 0) {
            strcpy(total, temp);
        }
        if (i == 1) {
            strcpy(free, temp);
        }
    }
    fclose(fp);

    for (i = 0, j = 0; i < strlen(total); i++) {
        if (isdigit(total[i])) {
            MemTotal[j++] = total[i];
        }
    }

    for (i = 0, j = 0; i < strlen(free); i++) {
        if (isdigit(free[i])) {
            MemFree[j++] = free[i];
        }
    }
    printf("memtotal:%ld M\n",atol(MemTotal)/1024);
    printf("memfree:%ld M\n",atol(MemFree)/1024);
    k = atof(MemFree)/atof(MemTotal);
    printf("k:%f\n",k);
    if(k>0.4)
        return 0;
    else
        return 1;
}

int main(int argc,char **argv)
{
    char infile[15] = "/proc/meminfo";
    mem_scale(infile);

    return 0;

}

运行结果:
memtotal:3290 M
memfree:3146 M
k:0.956202




--
/**************************************/
Name: Xiong Feng
E-mail:linux0818@gmail.com
MSN:linux0818@hotmail.com
QQ:23562033
Address: GuangZhou.China
/**************************************/

没有评论:

发表评论