LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1582|回复: 18

利用/proc文件系统实现系统监视的两个问题

[复制链接]
发表于 2005-4-6 20:31:09 | 显示全部楼层 |阅读模式
gkrellm可以实现对cpu利用率和某一分区利用率的监视
我也想把这个功能放到我的程序中
于是找了一些资料,也看了一下/proc的manpage
始终没找到在这些信息到底放在什么地方

原想看一下gkrellm的源码
但有没有分析大型程序的经验,一下就在gkrellm的源码中迷失了,搞的晕头转向

哪位大侠可以指点一下小弟
thx
发表于 2005-4-7 09:16:49 | 显示全部楼层
看一看/proc目录下的文件就知道了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-7 09:35:05 | 显示全部楼层
如果知道我就不会来问了:(
回复 支持 反对

使用道具 举报

发表于 2005-4-7 11:13:54 | 显示全部楼层
Post by nait

原想看一下gkrellm的源码
但有没有分析大型程序的经验,一下就在gkrellm的源码中迷失了,搞的晕头转向

哪位大侠可以指点一下小弟
thx

用gdb跟踪是理解源码最好的办法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-8 18:21:54 | 显示全部楼层
cpu利用率的算法我已经找到了
[PHP]#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static int timer;

void cb_quit()
{
  gtk_timeout_remove (timer);
  gtk_main_quit();
}

float
cal_load (void)
{
  FILE * fp;
  static long pre_user, pre_nice, pre_system, pre_idle; //in order to extend easily later, i defined four vars separately
  long user, nice, system, idle;
  long d_user, d_nice, d_system, d_idle;
  static long total;
  float scale;
  char buf[1024];

  if ((fp = fopen ("/proc/stat", "r")) != NULL){
    while (fgets (buf, sizeof(buf), fp)){
      if( *buf == 'c' && *(buf+1) == 'p') break;
    }
    fclose (fp);
  }
  else
    return 0.0;

  sscanf(buf, "cpu %ld %ld %ld %ld", &user, &nice, &system, &idle);
       
  // calculate delta value
  d_user = user - pre_user;
  d_nice = nice - pre_nice;
  d_system = system - pre_system;
  d_idle = idle - pre_idle;

  total = d_user + d_nice + d_system + d_idle;
  if (total < 1) total = 1;
  scale = 1.0 / total;

  pre_user = user;
  pre_nice = nice;
  pre_system = system;
  pre_idle = idle;

  return (d_user + d_nice + d_system) * scale;
}


gint Repaint (gpointer da)
{
  GtkWidget * drawing_area = (GtkWidget *)da;
  GdkDrawable * drawable = drawing_area->window;

  GdkGC *gc_chart, *gc_text;
  GdkColor color;

  static unsigned coory[201];
  int da_width, da_height;
  int x;
  float load;
  char buf[30];

  // set chart green
  gc_chart = gdk_gc_new (drawing_area->window);
  color.red = 0;
  color.green = 0xffff;
  color.blue = 0;
  gdk_gc_set_rgb_fg_color(gc_chart, &color );
  // set text red
  gc_text = gdk_gc_new (drawing_area->window);
  color.red = 0xffff;
  color.green = 0;
  color.blue = 0;
  gdk_gc_set_rgb_fg_color(gc_text, &color );

  // getting size of drawing area
  da_width = drawing_area->allocation.width;
  da_height = drawing_area->allocation.height;
  gdk_draw_rectangle (drawable, drawing_area->style->white_gc,
                      TRUE,
                      0,0,
                      da_width,
                      da_height);

  // chart cpu load
  for (x=0; x<200; x++)
    coory[x] = coory[x+1];

  load = cal_load();
  coory[x] = (int)(load * da_height);

  for(x=0;x<da_width;x++){
    gdk_draw_line (drawable, gc_chart, x, da_height, x, da_height - coory[x+1]);
  }

  // following code for drawing text
  sprintf (buf, "Cpu load: %.1f%%", load * 100);

  PangoLayout *layout = gtk_widget_create_pango_layout( da, buf );
  PangoFontDescription *fontdesc = pango_font_description_from_string( "Luxi Mono 12" );
  pango_layout_set_font_description( layout, fontdesc );
  gdk_draw_layout( drawable,
                   gc_text,
                   5, 5, layout );
  pango_font_description_free( fontdesc );
  g_object_unref( layout );

  g_object_unref( G_OBJECT(gc_chart) );
  g_object_unref( G_OBJECT(gc_text) );

  return TRUE;
}
       
int
main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *drawing_area;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW(window), "Cpu Load");
  drawing_area = gtk_drawing_area_new ();
  gtk_container_add (GTK_CONTAINER(window), drawing_area);

  gtk_signal_connect(GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(cb_quit), NULL);

  g_signal_connect( drawing_area, "expose_event",
                    G_CALLBACK(Repaint), NULL );

  gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), 200, 100);

  gtk_widget_show (drawing_area);
  gtk_widget_show(window);
  timer = gtk_timeout_add (1000, Repaint, (gpointer) drawing_area);
  gtk_main();

  return 0;
}[/PHP]

麻烦哪位用2.4内核的大哥替我试一下能否工作
thx

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-8 18:23:04 | 显示全部楼层
Post by kj501
用gdb跟踪是理解源码最好的办法。

多谢kj斑竹
我待会试一下
现在灌水   
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-9 10:30:50 | 显示全部楼层
辛辛苦苦跟踪了几个小时(数据结构好多啊,我快晕了)
最后出现
  1. (gdb) next
  2. Single stepping until exit from function gkrellm_init_plugin,
  3. which has no line number information.
  4. 0x40b33877 in ?? () from /usr/lib/gkrellm2/plugins/gkrellmms2.so
  5. (gdb) next
  6. Cannot find bounds of current function
复制代码

我彻底晕了
回复 支持 反对

使用道具 举报

发表于 2005-4-9 11:50:09 | 显示全部楼层
编译的动态库没有加上调试符号呀。重新编译吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-9 11:57:51 | 显示全部楼层
动态库怎么加调试符号?
我是直接在Makefile里吧FLAGS 加了-g
这样不行么
回复 支持 反对

使用道具 举报

发表于 2005-4-9 15:49:28 | 显示全部楼层
对动态库的调试我也没有经验,从这个链接中看看,好象有点特别:
http://lists.debian.org/debian-policy/1998/01/msg00027.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表