📄 my_proc.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 + -