⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my_proc.c

📁 .添加系统调用.采用编译内核的方法
💻 C
字号:
#include <stdio.h>
#include <gtk/gtk.h>
#include <string.h>
#include <time.h>
#define MY_MAX 100void hello(){printf("I love Linux\n");}typedef struct _mm_used_Data {
  GtkWidget *label;
  int timer;
} mm_used_Data;                    /*  显示时间*/  

static GtkWidget *clocker;

char *readHost();   /*读取主机信息*/
char *readOs();     /*读取系统信息*/
gint read_mm_timeout( gpointer data );     /*重显内存*/
char *read_mm_total();
gint delete_event( GtkWidget *widget,GdkEvent  *event,gpointer   data )
{    g_print ("delete event occurred\n");  /*关闭窗口时在命令提示符下显示*/
    return(TRUE);
}
void destroy( GtkWidget *widget, gpointer   data )/*关闭窗口*/
{
   gtk_main_quit(); 
}

char *readHost()
{       FILE *host;
	char hostName[MY_MAX];
	
	if((host=fopen("/proc/sys/kernel/hostname","r"))==NULL){   /*读proc中hostname文件,读取主机名字*/
		fprintf(stderr,"Can't open %s\n","/proc/sys/kernel/hostname");
		exit(-1);
	}else{
		if(fgets(hostName,MY_MAX,host)!=NULL)
			printf("%s\n",hostName);//for debug
	}
	fclose(host);
	static char newHost[MY_MAX] = "主机姓名:  ";
	strcat(newHost,hostName);/*复制*/
	return newHost;
}

void clock_begin()
{
	time_t now;
        struct tm *l_time;
        gchar buf[MY_MAX];
        now=time((time_t *)NULL);
        l_time=localtime(&now); /*读取本机时间*/
        sprintf(buf,"系统时间 %d : %d : %d",l_time->tm_hour,l_time->tm_min,l_time->tm_sec);

 	gtk_label_set_text(GTK_LABEL(clocker),buf);/*标签*/ 

}
char *readOs() /*读取系统Linux版本内核信息*/
{
	FILE *os1;
	FILE *os2;
	char osType1[MY_MAX];
	char osType2[MY_MAX/2];

	if((os1=fopen("/proc/sys/kernel/ostype","r"))==NULL){ /*打开ostype文件读取系统类型信息"Linux"*/
		fprintf(stderr,"Can't open %s\n","/proc/sys/kernel/ostype");
		exit(-1);
	}else{
		if(fgets(osType1,6,os1)!=NULL)
			printf("%s ",osType1);//for debug
	}
	if((os2=fopen("/proc/sys/kernel/osrelease","r"))==NULL){  /*读取内核"2.4.20-8custom"*/
		fprintf(stderr,"Can't open %s\n","/proc/sys/kernel/release");
		exit(-1);
	}else{
		if(fgets(osType2,MY_MAX,os2)!=NULL)
			printf("%s\n",osType2);//for debug
	}
	fclose(os1);
	fclose(os2);
	strcat(osType1,"  ");  
	strcat(osType1,osType2);   /*扩展成字符串"Linux 2.4.20-8custom"*/
	printf("readOs:%s\n",osType1);  /*在终端显示*/
	static char newOs[MY_MAX] = "系统内核信息 : ";
	strcat(newOs,osType1);   
	return newOs;
}   

gint read_mm_timeout( gpointer data )  /*重显内存*/
{
	mm_used_Data *mdata = (mm_used_Data *)data;
	FILE *mm;
	int i;
	char mmT[MY_MAX/2];
	
	if((mm=fopen("/proc/meminfo","r"))==NULL){
		fprintf(stderr,"Can't open %s\n","/proc/meminfo");
		exit(-1);
	}else{
		for(i=0;fgets(mmT,MY_MAX/2,mm)!=NULL&&i<11;i++);	
	}
	char *mmTemp1 = strchr(mmT,':');
	char mm_used[MY_MAX] = "已用物理内存 : ";
	mmTemp1 +=10;  /*输出格式*/
	strcat(mm_used,mmTemp1);
	gtk_label_set_text( GTK_LABEL(mdata->label), mm_used );
	fclose(mm);
	return TRUE;
}

char *read_mm_total()  /*读取物理总内存*/
{
	FILE *mm;
	int i;
	char mmT[MY_MAX/2];
	if((mm=fopen("/proc/meminfo","r"))==NULL){
		fprintf(stderr,"Can't open %s\n","/proc/meminfo");
		exit(-1);
	}else{
		for(i=0;fgets(mmT,MY_MAX/2,mm)!=NULL&&i<5;i++);	
	}
	static char mm_total[MY_MAX] = "物理总内存 : ";
        char *mmTemp1 = strchr(mmT,':');
	mmTemp1 +=8;
	strcat(mm_total,mmTemp1);
	fclose(mm);
	return mm_total;
}

int main( int   argc, char *argv[] )
{
       GtkWidget *window;
       GtkWidget *vpaned;
       GtkWidget *label,*labelS;
       GtkWidget *table,*table2;
       GtkWidget *mm_table;
       GtkWidget *button;
       mm_used_Data *mdata;

	gtk_init(&argc, &argv);
        /*构造显示窗口*/
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title (GTK_WINDOW (window),              "简单的Proc信息读取  作者:郑章孝 学号:012002013324");  /*定义窗口的标签*/
    	gtk_signal_connect (GTK_OBJECT (window), "delete_event",                        GTK_SIGNAL_FUNC (delete_event),NULL);
     		        gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (destroy), NULL);
    		gtk_container_set_border_width (GTK_CONTAINER (window), 15);
    		gtk_widget_set_size_request (GTK_WIDGET (window), 500, 350);
       /*define a vpaned*/
		vpaned = gtk_vpaned_new ();
    		gtk_container_add (GTK_CONTAINER (window), vpaned);
    		gtk_widget_show (vpaned);        /*define a table*/
		table = gtk_table_new(2,1,TRUE);
    		gtk_widget_show (table);
    		gtk_paned_add2 (GTK_PANED (vpaned), table);
       /*show button with 主机姓名 as a label*/
		button = gtk_button_new_with_label (readHost());
		gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (hello), NULL);                                          gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy),                                        GTK_OBJECT (window));
        	gtk_container_add (GTK_CONTAINER (table), button);
		gtk_widget_show (button); 
     


	/*define table2 attached to table in order to show the time*/
		table2 = gtk_table_new(5,1,TRUE);
    		gtk_table_attach_defaults(GTK_TABLE(table),table2, 0,1,1,2);    
    		gtk_widget_show (table2);
		clocker = gtk_label_new("");
    		gtk_widget_show (clocker); 
    		gtk_table_attach_defaults(GTK_TABLE(table2),clocker, 0,2,4,5); 
		gtk_timeout_add(1000,(GtkFunction)clock_begin,NULL);                      /*show labelS with Sytem Edition attached to the table*/
		char *systemEdition = readOs();                labelS = gtk_label_new (systemEdition);                gtk_widget_show (labelS);                gtk_table_attach_defaults(GTK_TABLE(table2),labelS, 0,2,1,3);

	/*define mm_table attached to table2 with 2 lables showing the usage of MM*/
		mm_table = gtk_table_new(1,2,TRUE);
    		gtk_table_attach_defaults(GTK_TABLE(table2),mm_table, 0,2,3,4);    
    		gtk_widget_show (mm_table); 

		mdata->label = gtk_label_new ("已用物理内存 : ");
		gtk_label_set_justify( GTK_LABEL(mdata->label), GTK_JUSTIFY_LEFT );
    		gtk_widget_show (mdata->label);

    		gtk_table_attach_defaults(GTK_TABLE(mm_table),mdata->label, 0,1,0,1); 
    
    		mdata->timer = gtk_timeout_add (500, read_mm_timeout, mdata);

    		char *mmTotal = read_mm_total();
    		label = gtk_label_new (mmTotal);
    		gtk_widget_show (label);
    		gtk_table_attach_defaults(GTK_TABLE(mm_table),label, 1,2,0,1); 

	/*show the window*/
		gtk_widget_show(table);
		gtk_widget_show (window);
		gtk_main ();
	return(0);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -