版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)目的</b></p><p> 掌握Linux操作系統(tǒng)的使用方法;</p><p> 了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);</p><p> 掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。</p><p> 培養(yǎng)良好的自學(xué)習(xí)慣和能力。</p><p><b>
2、課程設(shè)計(jì)內(nèi)容</b></p><p> 1 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握Linux下的編程環(huán)境。</p><p> 編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫。</p><p> 2 掌握Linux下添加設(shè)備驅(qū)動(dòng)程序的方法。以模塊的方式,實(shí)現(xiàn)一個(gè)虛擬的字符設(shè)備驅(qū)動(dòng)程序。
3、</p><p> 采用模塊方法,添加一個(gè)新的設(shè)備驅(qū)動(dòng)程序</p><p> 要求添加字符設(shè)備的驅(qū)動(dòng)</p><p> 編寫一個(gè)應(yīng)用程序,測試添加的驅(qū)動(dòng)程序</p><p> 3了解和掌握/proc文件的特點(diǎn)和使用方法</p><p> 了解/proc文件的特點(diǎn)和使用方法;</p><p&
4、gt; 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況;</p><p> 用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài).</p><p><b> 課程設(shè)計(jì)過程及源碼</b></p><p> 1、 編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫。</p><p> 程序說明:首先是主程序通
5、過fork() 函數(shù)創(chuàng)建新進(jìn)程,然后通過調(diào)用execv 打開新文件以達(dá)到并發(fā)執(zhí)行三個(gè)程序的目的.子程序則使用了GTK 編程,在一個(gè)窗體中放置了一個(gè)進(jìn)度條,加了個(gè)文字標(biāo)簽以改善視覺效果.</p><p><b> //proc1.c</b></p><p> #include <gtk/gtk.h></p><p> #incl
6、ude <string.h></p><p> typedef struct _ProgressData {</p><p> GtkWidget *window;</p><p> GtkWidget *pbar;</p><p> int timer;</p><p> gboolean ac
7、tivity_mode;</p><p> }ProgressData;</p><p> /*更新進(jìn)度條,使進(jìn)度條的移動(dòng)*/</p><p> gint progress_timeout( gpointer data )</p><p><b> {</b></p><p> Prog
8、ressData *pdata = (ProgressData *)data;</p><p> gdouble new_val;</p><p><b> int v;</b></p><p> char text[20]="0%";</p><p> new_val=gtk_progres
9、s_bar_get_fraction(GTK_PROGRESS_BAR(pdata->pbar))+ 0.01;</p><p> if (new_val > 1.0) </p><p> new_val = 0.0;</p><p> v=(int)(new_val*100);</p><p> strcpy(text,
10、"");</p><p> sprintf(text,"%d",v);</p><p> strcat(text," %");</p><p> gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata->pbar),new_val);</p
11、><p> gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata->pbar),text);</p><p> return TRUE;</p><p><b> }</b></p><p> void destroy_progress( GtkWidget *wid
12、get,ProgressData *pdata){ /*退出*/</p><p> gtk_timeout_remove (pdata->timer);</p><p> pdata->timer = 0;</p><p> pdata->window = NULL;</p><p> g_free (pdata
13、);</p><p> gtk_main_quit ();</p><p><b> }</b></p><p> int main( int argc,char *argv[]){</p><p> ProgressData *pdata;</p><p> GtkWidget *
14、align;</p><p> GtkWidget *separator;</p><p> GtkWidget *table;</p><p> GtkWidget *button;</p><p> GtkWidget *vbox; </p><p> gtk_init (&argc, &
15、argv);</p><p> //為傳遞到回調(diào)函數(shù)中的數(shù)據(jù)分配內(nèi)存</p><p> pdata = g_malloc (sizeof (ProgressData));</p><p> pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);</p><p> pdata-&
16、gt;pbar = gtk_progress_bar_new ();</p><p> pdata->activity_mode= !pdata->activity_mode;</p><p> gtk_progress_bar_pulse(GTK_PROGRESS_BAR (pdata->pbar));</p><p> gtk_progr
17、ess_bar_set_fraction(GTK_PROGRESS_BAR(pdata->pbar),0.00);</p><p> gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata->pbar),"0.00");</p><p> gtk_container_add (GTK_CONTAINER (ali
18、gn), pdata->pbar);</p><p> gtk_widget_show (pdata->pbar);</p><p> /* 加一個(gè)定時(shí)器(timer),以更新進(jìn)度條的值*/</p><p> pdata->timer = gtk_timeout_add (100, progress_timeout, pdata);</
19、p><p> separator = gtk_hseparator_new ();</p><p> gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);</p><p> gtk_widget_show (separator);</p><p> table =
20、 gtk_table_new (2, 2, FALSE);</p><p> gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);</p><p> gtk_widget_show (table);</p><p> button = gtk_button_new_with_label (&qu
21、ot;close");</p><p> g_signal_connect_swapped (G_OBJECT (button), "clicked",</p><p> G_CALLBACK (gtk_widget_destroy),</p><p> pdata->window);</p><p>
22、; gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);</p><p> GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);</p><p> gtk_widget_grab_default (button);</p><p> gtk_wid
23、get_show (button);</p><p> gtk_widget_show (pdata->window);</p><p> gtk_main ();</p><p><b> return 0;</b></p><p><b> }</b></p><
24、;p> //m_proc1.c</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <pthread.h></p><p> #include <sys/types.h></p
25、><p> #include <linux/sem.h></p><p> int semid;</p><p> char *finish;</p><p> int p1,p2;</p><p> int main (void)</p><p><b> {&l
26、t;/b></p><p> if((p1=fork())==0)//創(chuàng)建新進(jìn)程</p><p><b> {</b></p><p> execv("./p1",NULL);</p><p><b> }</b></p><p><b
27、> else</b></p><p><b> {</b></p><p> if((p2=fork())==0)</p><p><b> {</b></p><p><b> sleep(1);</b></p><p>
28、 execv("./p2",NULL);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if (fork()==0)</p><p>
29、<b> {</b></p><p><b> sleep(2);</b></p><p> execv("./p3",NULL);//打開文件執(zhí)行</p><p><b> }</b></p><p><b> }</b>&
30、lt;/p><p><b> }</b></p><p><b> return;</b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果:</b></p><p><b> 2、 字符驅(qū)動(dòng)
31、程序</b></p><p> 程序說明:對于實(shí)現(xiàn)字符設(shè)備的驅(qū)動(dòng),首先要掛載字符設(shè)備,然后加載設(shè)備的驅(qū)動(dòng)程序,然后再調(diào)用測試程序進(jìn)行測試.我們用insmod來掛載驅(qū)動(dòng),然后使用mknod c 設(shè)備名稱 設(shè)備號來分配設(shè)備號,這里c 表示是字符設(shè)備.然后我們可以通過dmesg 查看每一步的進(jìn)展情況.掛載設(shè)備成功后,通過lsmod 來查看所有掛載的設(shè)備,卸載設(shè)備則使用rmmod 設(shè)備號.所有這些完成后便可
32、以開始測試了,編寫測試程序test.c 包含讀設(shè)備和寫設(shè)備.</p><p> 具體操作步驟(在根目錄下執(zhí)行):</p><p><b> Make</b></p><p> Insmod mydev.ko //掛載設(shè)備</p><p> Mknod /dev/mydev c 249 0 //分配設(shè)備號&l
33、t;/p><p> Gcc –o test test.c //編譯測試程序</p><p> ./test //運(yùn)行測試程序</p><p> Rmmod mydev //卸載設(shè)備</p><p> Rm /dev/mydev //刪除設(shè)備號</p><p>&
34、lt;b> //Mydev.c</b></p><p> #include <linux/module.h></p><p> #include <linux/init.h></p><p> #include <linux/kernel.h></p><p> #include
35、 <linux/fs.h></p><p> #include <linux/types.h></p><p> #include <asm/uaccess.h></p><p> MODULE_LICENSE("Dual BSD/GPL");</p><p> int myde
36、v_major = 0;</p><p> char *buffer=" ";</p><p> ssize_t mydev_write (struct file *filp, const char __user *buf, size_t count,loff_t *pos){</p><p><b> int ret;</
37、b></p><p> ret=copy_from_user(buffer,buf,count);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //buf是用戶進(jìn)程空間的一個(gè)地址.但是在mydev_read被調(diào)用時(shí),系統(tǒng)
38、進(jìn)入核心態(tài).</p><p> //所以不能使用buf這個(gè)地址,必須用copy_to_user,這是kernel提供的一個(gè)函數(shù),用于向用戶傳送數(shù)據(jù).</p><p> ssize_t mydev_read(struct file *filp, char __user *buf,size_t count, loff_t *pos){</p><p><b&g
39、t; int ret;</b></p><p> ret=copy_to_user(buf,buffer,count);</p><p><b> return 1;</b></p><p><b> }</b></p><p> struct file_operations
40、mydev_fops ={ //系統(tǒng)調(diào)用和驅(qū)動(dòng)程序關(guān)聯(lián)起來</p><p> .read = mydev_read,</p><p> .write = mydev_write,</p><p> .owner = THIS_MODULE</p><p><b> };</b></p><p&
41、gt; int mydev_init(void){</p><p> if((mydev_major=register_chrdev (0, "mydev", &mydev_fops))>=0){</p><p> printk("register success!\n");</p><p><b&g
42、t; return 1;</b></p><p><b> }</b></p><p><b> else{</b></p><p> printk("register failed!\n");</p><p><b> return 0;<
43、/b></p><p><b> }</b></p><p><b> }</b></p><p> void mydev_cleanup(void){</p><p> unregister_chrdev (mydev_major, "mydev");</p
44、><p><b> }</b></p><p> module_init(mydev_init);</p><p> module_exit(mydev_cleanup);</p><p> //makefile</p><p> ifneq ($(KERNELRELEASE),)</
45、p><p> obj-m := mydev.o</p><p><b> else</b></p><p> KERNELDIR ?= /lib/modules/$(shell uname -r)/build</p><p> PWD := $(shell pwd)</p><p><b
46、> default:</b></p><p> $(MAKE) -C $(KERNELDIR) M=$(PWD) modules</p><p><b> endif</b></p><p><b> install:</b></p><p> sudo insmod m
47、ydev.ko</p><p><b> unstall:</b></p><p> sudo rmmod mydev</p><p><b> clean:</b></p><p> rm -rf *.o *.ko .*.cmd *.mod.c .tmp_versions</p>
48、;<p><b> //test.c</b></p><p> #include <fcntl.h></p><p> #include <stdio.h></p><p> #define MAXBUFF 1024</p><p> #define DEVICE &quo
49、t;/dev/mydev"</p><p> int main(void){</p><p> char buff[MAXBUFF],buff2[MAXBUFF];</p><p><b> int fd;</b></p><p> printf("Now driver test beginn
50、ing...\n");</p><p> printf("Open device...\n");</p><p> if ((fd=open(DEVICE,O_RDWR))<0){</p><p> printf("Open device is failed\n");</p><p&g
51、t;<b> return 1;</b></p><p><b> }</b></p><p><b> else{</b></p><p> read(fd,buff,MAXBUFF);</p><p> printf("the content of de
52、vice is readed:\n%s\n",buff);</p><p> printf("input something to device whatever you want:\n");</p><p> scanf("%s",buff);</p><p> printf("write your
53、 input to device...\n");</p><p> write(fd,buff,MAXBUFF);</p><p> read(fd,buff2,MAXBUFF);</p><p> printf("the content of device is readed again:\n%s\n",buff2);<
54、/p><p><b> }</b></p><p> printf("the driver test is ended successful\n");</p><p><b> return 0;</b></p><p><b> }</b></p
55、><p><b> 操作界面演示:</b></p><p> 掛載后用 cat /proc/devices 查看分配的設(shè)備號</p><p> Lsmod查看掛載成功的設(shè)備</p><p> 用測試程序測試掛載的驅(qū)動(dòng)</p><p> 3、 用GTK做一個(gè)系統(tǒng)監(jiān)視器</p>&
56、lt;p> 程序說明:通過/proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取proc文件時(shí),proc文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。</p><p> 我們要顯示系統(tǒng)信息,只需進(jìn)行相應(yīng)的文件操作。首先打開相應(yīng)的文件,讀取所需要的信息,將其寫入一個(gè)緩沖區(qū)中,然后將緩沖區(qū)的內(nèi)容加到Gtk的相應(yīng)的控件上面去,最后將控件組合顯示即可。</p
57、><p> 源程序://explorer.c</p><p> #include<dirent.h></p><p> #include<fcntl.h></p><p> #include<signal.h></p><p> #include<stdio.h>&
58、lt;/p><p> #include<stdlib.h></p><p> #include<string.h></p><p> #include<time.h></p><p> #include<unistd.h></p><p> #include<
59、gtk/gtk.h></p><p> #include<gdk/gdk.h></p><p> #include<gdk/gdkkeysyms.h></p><p> #include<sys/stat.h></p><p> #include<sys/types.h></
60、p><p> #include<sys/wait.h></p><p> //系統(tǒng)參數(shù)的數(shù)據(jù)結(jié)構(gòu)</p><p> typedef struct SYS_PARAMETER {</p><p> char hostname[22]; //主機(jī)名</p><p> char kernel_
61、version[33];//內(nèi)核版本</p><p> char cpu_model[38]; //cpu型號</p><p> char cpu_mhz[9];//CPU頻率參數(shù)</p><p> char keep_time[10]; //CPU到目前持續(xù)運(yùn)行時(shí)間</p><p> char tot
62、al_mem[8];//總內(nèi)存大小</p><p> char memfree[8]; //空閑內(nèi)存大小</p><p> char buffers[8]; </p><p> char cached[8]; //磁盤緩存大小</p><p> float mem_userate;//內(nèi)存利用率
63、</p><p> float pre_cpu_use_time; //之前CPU使用的總時(shí)間</p><p> float pre_cpu_total_time; </p><p> float now_cpu_use_time; //當(dāng)前CPU使用的總時(shí)間</p><p> float now_cpu_total_time
64、; </p><p> } SYS_PARAMETER;</p><p> //系統(tǒng)進(jìn)程狀態(tài)的結(jié)構(gòu)</p><p> typedef struct PROCESS_STAT {</p><p> char * fname; //父進(jìn)程號</p><p> char * level;
65、 //進(jìn)程優(yōu)先級</p><p> char * mem_use; //內(nèi)存使用情況</p><p> struct PROCESS_STAT * next; //指向下一個(gè)進(jìn)程狀態(tài)的指針</p><p> } PROCESS_STAT;</p><p> SYS_PARAMETER
66、* sys_parameter = NULL; </p><p> GtkWidget * main_window; </p><p> GtkWidget * main_vbox; </p><p> GtkWidget * main_notebook;
67、 //notebook控件</p><p> GtkWidget * main_table; //存放notebook的table</p><p> GtkWidget * main_frame[4]; </p><p> GtkWidget * process_list;
68、 //進(jìn)程列表</p><p> GtkWidget * keep_time_label; //顯示系統(tǒng)持續(xù)運(yùn)行時(shí)間的label</p><p> GtkWidget * time_label; //顯示當(dāng)前時(shí)間的label</p><p> GtkWidget *
69、pro_num_label;</p><p> GtkWidget * entry; //進(jìn)程號的輸入框</p><p> GtkWidget * cpu_use_label; //顯示CPU使用情況的label</p><p> GtkWidget * mem_use_label
70、; //顯示內(nèi)存使用情況的label</p><p> GdkPixmap * pixmap = NULL;</p><p> GtkWidget * drawing_area;</p><p> GdkPixmap * pixmap1 = NULL;</p><p> GtkWidget * draw
71、ing_area1;</p><p> DIR * dir; //要打開的目錄</p><p> pid_t selected_process; //被選中的進(jìn)程號</p><p> int selected_row;</p><p>
72、 int pro_num;</p><p> int is_fresh = 1; //設(shè)置是否刷新進(jìn)程信息</p><p> int fresh_level = 10; //進(jìn)程信息刷新頻率,即多少秒刷新一次</p><p> int fresh_time = 0;
73、 //刷新計(jì)時(shí)器</p><p> int CPU[60]; //用于顯示CPU折線圖的數(shù)組信息</p><p> int MEM[60]; //用于顯示內(nèi)存折線圖的數(shù)組信息</p><p> int pro_f
74、lag[32768];</p><p> void dialog_show(char * title, char * text) {</p><p> GtkWidget * dialog;</p><p> GtkWidget * label;</p><p> dialog = gtk_dialog_new_with_button
75、s(title, GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL);</p><p> gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);</p><p> g_signal_conne
76、ct_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);</p><p> label = gtk_label_new(text);</p><p> gtk_widget_show(label);</p><p> gtk_container_set_b
77、order_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 10);</p><p> gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),label);</p><p> gtk_widget_show (dialog);</p><p>
78、<b> }</b></p><p> //得到當(dāng)前所有進(jìn)程狀態(tài)</p><p> void get_process_stat() {</p><p> PROCESS_STAT * p;</p><p> struct dirent * ptr;</p><p> char temp
79、[200], tmp[200], pro[20], stat[10], ppid[10];</p><p> gchar * drink[4];</p><p> int i, j, fp;</p><p> p = (PROCESS_STAT *)malloc(sizeof(PROCESS_STAT));</p><p> dir
80、= opendir("/proc");</p><p> //循環(huán)讀取/proc目錄下數(shù)字目錄即進(jìn)程目錄,并將對應(yīng)進(jìn)程的部分信息存儲到進(jìn)程信息鏈表中</p><p> pro_num = 0;</p><p> while((ptr = readdir(dir)) != NULL) if(isdigit(ptr->d_name[0])
81、 && pro_flag[atoi(ptr->d_name)]) {</p><p> sprintf(tmp, "/proc/%s/stat\0", ptr->d_name);</p><p> fp = open(tmp, O_RDONLY);</p><p> read(fp, temp, 200);<
82、;/p><p> close(fp);</p><p> //獲取進(jìn)程的所屬的運(yùn)行程序</p><p><b> i = 0;</b></p><p> while(temp[i] != ' ') i++;</p><p><b> i += 2;</b>
83、;</p><p><b> j = 0;</b></p><p> while(temp[i] != ')') {</p><p> pro[j] = temp[i];</p><p><b> i++;</b></p><p><b>
84、 j++;</b></p><p><b> }</b></p><p> pro[j] = '\0';</p><p> drink[3] = pro;</p><p><b> //獲取進(jìn)程的狀態(tài)</b></p><p><b&g
85、t; i += 2;</b></p><p><b> j = 0;</b></p><p> while(temp[i] != ' ') {</p><p> stat[j] = temp[i];</p><p><b> i++;</b></p>
86、<p><b> j++;</b></p><p><b> }</b></p><p> stat[j] = '\0';</p><p> drink[1] = stat;</p><p> //獲取進(jìn)程的父進(jìn)程號</p><p>&
87、lt;b> i++;</b></p><p><b> j = 0;</b></p><p> while(temp[i] != ' ') {</p><p> ppid[j] = temp[i];</p><p><b> i++;</b></p&
88、gt;<p><b> j++;</b></p><p><b> }</b></p><p> ppid[j] = '\0';</p><p> drink[2] = ppid;</p><p> drink[0] = ptr->d_name;<
89、/p><p> gtk_clist_append((GtkCList *)process_list, drink);//在進(jìn)程列表中添加該進(jìn)程的信息</p><p> pro_num++;</p><p> pro_flag[atoi(ptr->d_name)] = 0;</p><p><b> }</b>&
90、lt;/p><p> closedir(dir);</p><p><b> return;</b></p><p><b> }</b></p><p> void get_static_SYSPARA(void) {</p><p> char temp[1000]
91、, * temp1;</p><p> int i, fp;</p><p><b> //獲取主機(jī)名</b></p><p> fp = open("/proc/sys/kernel/hostname", O_RDONLY);</p><p> read(fp, temp, 200);<
92、;/p><p> close(fp);</p><p> for(i = 0; i < 22; i++) sys_parameter->hostname[i] = temp[i];</p><p> sys_parameter->hostname[21] = 0;</p><p><b> //獲取內(nèi)核版本&l
93、t;/b></p><p> fp = open("/proc/version", O_RDONLY);</p><p> read(fp, temp, 200);</p><p> close(fp);</p><p><b> i = 0;</b></p><p&
94、gt; while(temp[i] != '(') {</p><p> sys_parameter->kernel_version[i] = temp[i];</p><p><b> i++;</b></p><p><b> }</b></p><p> sys
95、_parameter->kernel_version[i] = 0;</p><p> //獲取CPU信息存儲到字符串中</p><p> fp = open("/proc/cpuinfo", O_RDONLY);</p><p> read(fp, temp, 1000);</p><p> close(f
96、p);</p><p> //從字符串中得到CPU型號</p><p> for(i = 0; i < 38; i++) sys_parameter->cpu_model[i] = temp[i + 79];</p><p> sys_parameter->cpu_model[37] = 0;</p><p> //
97、從字符串中得到CPU頻率參數(shù)</p><p> for(i = 0; i < 9; i++) sys_parameter->cpu_mhz[i] = temp[i + 151];</p><p> sys_parameter->cpu_mhz[8] = 0;</p><p> //獲取關(guān)于內(nèi)存的信息</p><p>
98、 fp = open("/proc/meminfo", O_RDONLY);</p><p> read(fp, temp, 1000);</p><p> close(fp);</p><p><b> //獲取內(nèi)存的大小</b></p><p> temp1 = strstr(temp,
99、 "MemTotal");</p><p> for(i = 0; i < 8; i++) sys_parameter->total_mem[i] = temp1[i + 16];</p><p> sys_parameter->total_mem[7] = 0;</p><p><b> }</b>
100、</p><p> read(fp, temp, 200);</p><p> close(fp);</p><p><b> i = 0;</b></p><p> while(temp[i] != '.') {</p><p> sys_parameter->k
101、eep_time[i] = temp[i];</p><p><b> i++ ;</b></p><p><b> }</b></p><p> sys_parameter->keep_time[i] = 0;</p><p> //得到CPU當(dāng)前信息的函數(shù),用于求CPU使用率<
102、;/p><p> fp = open("/proc/stat", O_RDONLY);</p><p> read(fp, temp, 200);</p><p> close(fp);</p><p><b> i = 0;</b></p><p> while(tem
103、p[i] != ' ') i++;</p><p><b> i += 3;</b></p><p><b> j = 0;</b></p><p> while(temp[i]!= ' ') {//得到USER時(shí)間</p><p> temp2[j] = t
104、emp[i];</p><p><b> i++;</b></p><p><b> j++;</b></p><p><b> }</b></p><p> temp2[j] = '\0';</p><p> user = a
105、toi(temp2);</p><p><b> j = 0;</b></p><p><b> i += 2;</b></p><p> while(temp[i]!= ' ') {//得到SYS時(shí)間</p><p> temp2[j] = temp[i];</p&g
106、t;<p><b> i++;</b></p><p><b> j++;</b></p><p><b> }</b></p><p> temp2[j] = '\0';</p><p> sys = atoi(temp2);</
107、p><p><b> j = 0;</b></p><p><b> i++;</b></p><p> while(temp[i]!= ' ') {//得到NICE時(shí)間</p><p> temp2[j] = temp[i];</p><p><b
108、> i++;</b></p><p><b> j++;</b></p><p><b> }</b></p><p> temp2[j] = '\0';</p><p> nice = atoi(temp2);</p><p>&
109、lt;b> j = 0;</b></p><p><b> i++;</b></p><p> while(temp[i]!= ' ') {//得到IDLE時(shí)間</p><p> temp2[j] = temp[i];</p><p><b> i++;</b&
110、gt;</p><p><b> j++;</b></p><p><b> }</b></p><p> temp1 = strstr(temp, "MemFree");</p><p> for(i = 0; i < 8; i++) sys_parameter
111、->memfree[i] = temp1[i + 16];</p><p> sys_parameter->memfree[7] = 0;</p><p> //獲取活動(dòng)內(nèi)存的大小</p><p> temp3 = strstr(temp, "Buffers");</p><p> for(i = 0
112、; i < 8; i++) sys_parameter->buffers[i] = temp3[i + 16];</p><p> sys_parameter->buffers[7] = 0;</p><p> //獲取活動(dòng)內(nèi)存的大小</p><p> temp4 = strstr(temp, "Cached");<
113、;/p><p> for(i = 0; i < 8; i++) sys_parameter->cached[i] = temp4[i + 16];</p><p> sys_parameter->cached[7] = 0;</p><p><b> //求內(nèi)存利用率</b></p><p> to
114、tal_mem = atof(sys_parameter->total_mem);</p><p> active_mem =total_mem - atof(sys_parameter->memfree) - atof(sys_parameter->buffers) - atof(sys_parameter->cached);</p><p> sys_par
115、ameter->mem_userate = active_mem / total_mem;</p><p><b> }</b></p><p> //顯示系統(tǒng)到目前的持續(xù)運(yùn)行時(shí)間</p><p> void draw_keep_time() {</p><p> char hs[7] = " h
116、ours ", ms[9] = " minutes ", ss[9] = " seconds "; </p><p> char temp[3], temp1[3], keep_time_c[35];</p><p><b> int i, j;</b></p><p> int keep
117、_time, hour, minute, second;</p><p> float hour_f, minute_f, second_f;</p><p> keep_time = atoi(sys_parameter->keep_time);</p><p> hour = keep_time / 3600; //得到運(yùn)行小時(shí)&
118、lt;/p><p> keep_time -= 3600 * hour;</p><p> minute = keep_time / 60; //得到運(yùn)行分鐘</p><p> second = keep_time % 60; //得到運(yùn)行秒</p><p> hour_f = (float)hou
119、r; //下面這些工作都是將時(shí)間轉(zhuǎn)化為字符串形式</p><p> minute_f = (float)minute;</p><p> second_f = (float)second;</p><p><b> i = 0;</b></p><p><b> j = 0;<
120、;/b></p><p> gcvt(hour_f, 2, temp);//將小時(shí)轉(zhuǎn)換為字符串</p><p> while(temp[j] != '\0') {</p><p> keep_time_c[i] = temp[j];</p><p><b> i++;</b></p
121、><p><b> j++;</b></p><p><b> }</b></p><p> for(j = 0; j < 7; j++, i++) keep_time_c[i] = hs[j];</p><p><b> j = 0;</b></p>
122、<p> gcvt(minute_f, 2, temp);</p><p> while(temp[j] != '\0') {</p><p> keep_time_c[i] = temp[j];</p><p><b> i++;</b></p><p><b> j++;
123、</b></p><p><b> }</b></p><p> for(j = 0; j < 9; j++, i++) keep_time_c[i] = ms[j];</p><p><b> j = 0;</b></p><p> gcvt(second_f, 2, t
124、emp);</p><p> while(temp[j] != '\0') {</p><p> keep_time_c[i] = temp[j];</p><p><b> i++;</b></p><p><b> j++;</b></p><p>
125、;<b> }</b></p><p> for(j = 0; j < 9; j++, i++) keep_time_c[i] = ss[j];</p><p> keep_time_c[i] = '\0';</p><p> gtk_label_set_text((GtkLabel *)keep_time_lab
126、el, keep_time_c);</p><p><b> }</b></p><p> gboolean draw_CPU() {</p><p><b> int i, a;</b></p><p><b> a = 263;</b></p><
127、;p> gdk_draw_rectangle(pixmap, drawing_area->style->white_gc, TRUE, 0, 0, drawing_area->allocation.width, drawing_area->allocation.height);</p><p> gdk_draw_line(pixmap, drawing_area->sty
128、le->black_gc, 264, 52, 264, 2);</p><p> gdk_draw_line(pixmap, drawing_area->style->black_gc, 13, 52, 268, 52);</p><p> for(i = 0; i < 6; i++) {</p><p> gdk_draw_line(
129、pixmap, drawing_area->style->black_gc, 264, 52 - 10 * i, 268, 52 - 10 * i);</p><p><b> }</b></p><p> for(i = 59; i > 0; i--) {</p><p> gdk_draw_line(pixmap,
130、drawing_area->style->black_gc, a, 52 - CPU[i], a - 4, 52 - CPU[i - 1]);</p><p><b> a -= 4;</b></p><p><b> }</b></p><p> gtk_widget_queue_draw(drawin
131、g_area);</p><p> return TRUE;</p><p><b> }</b></p><p> gboolean draw_MEM() {</p><p><b> int i, a;</b></p><p><b> a = 263
132、;</b></p><p> gdk_draw_rectangle(pixmap1, drawing_area1->style->white_gc, TRUE, 0, 0, drawing_area1->allocation.width, drawing_area1->allocation.height);</p><p> gdk_draw_lin
133、e(pixmap1, drawing_area1->style->black_gc, 264, 52, 264, 2);</p><p> gdk_draw_line(pixmap1, drawing_area1->style->black_gc, 13, 52, 268, 52);</p><p> for(i = 0; i < 6; i++) {<
134、;/p><p> gdk_draw_line(pixmap1, drawing_area1->style->black_gc, 264, 52 - 10 * i, 268, 52 - 10 * i);</p><p><b> }</b></p><p> for(i = 59; i > 0; i--) {</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)題目
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)論文
- 操作系統(tǒng)課程設(shè)計(jì) (4)
- 操作系統(tǒng)課程設(shè)計(jì)1
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)原理課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)1
評論
0/150
提交評論