




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
華中科技大學嵌入式操作系統課程設計實驗報告院 系: 計算機科學與技術學院專 業:班 級:姓 名:指導老師:報告時間:計算機科學與技術學院 操作系統課程設計實驗報告 U201014281計算機科學與技術學院目錄課程設計目的??????????????????????3課程設計環境搭建????????????????????3內容一:熟悉和理解Linux編程環境3.1內容要求??????????????????????????53.2設計過程及實現???????????????????????5內容二:掌握添加系統調用的方法4.1內容要求?????????????????????????? 94.2設計過程及實現??????????????????????? 9內容三:掌握添加設備驅動程序的方法5.1內容要求 ????????????????????????? 175.2設計過程及實現 ?????????????????????? 17內容四:理解和分析/proc文件6.1內容要求 ????????????????????????? 226.2設計過程及實現 ?????????????????????? 22__________________________第2頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281課程設計目的1)掌握Linux操作系統的使用方法;2)了解Linux系統內核代碼結構;3)掌握實例操作系統的實現方法。課程設計環境搭建1)windows7上,利用虛擬機軟件VMware軟件搭建的linux平臺:◎Ubuntu11.10 (安裝包:ubuntu-11.10-desktop-i386 )◎內核:linux-headers-3.0.0-12-generic(2)更改root登錄:在現階段Ubuntu的系統中,是不允許直接以 root身份登錄系統的,但是在做課設的過程中,需要大量的使用 root權限來進行命令的操作。如果以普通用戶登錄 ubuntu,會連編輯一個文件都非常周折。為此,我找到了一種修改系統文件,以達到直接使用 root身份登錄的方法:◎開始的時候,只能以普通用戶登錄,用 Ctrl+Alt+T 打開終端:初始化/修改root密碼sudopasswdroot用vi編輯器修改這個文件:sudovi/etc/lightdm/lightdm.conf在文件最后加入這么一行代碼:greeter-show-manual-login=true然后保存退出,sudoreboot 重啟系統。之后就可以輸入 root用戶登錄。3)在添加系統調用中用到的其他內核包:◎下載和當前實驗環境最為接近的系統版本(這點很重要)使用apt-getinstalllinux-source-3.0.0命令,◎下載結果是linux-source-3.0.0.tar.bz2◎解壓命令:tar –xjvflinux-source-3.0.0.tar.bz2 –C/usr/src◎解壓后,在/usr/src 目錄下得到內核文件夾 linux-source-3.0.0__________________________第3頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142814)在調用linux圖形庫時需要安裝GTK環境:◎安裝gcc/g++/gdb/make等基本編程工具apt-getinstallbuild-essentialTip:如果提示由于依賴項不能安裝,需要使用 apt的強化版aptitude,這個工具可以自動分析軟件包依賴,系統一般不自帶,需要先安裝,具體過程是:apt-getinstallaptitudeaptitudeinstallbuild-essentialaptitude 這個工具很強大,對于解決軟件包安裝時的依賴問題很有幫助。◎安裝libgtk2.0-devlibglib2.0-dev 等開發相關的庫文件:apt-getinstallgnome-core-devel◎安裝GTK核心組件:apt-getinstalllibgtk2.0-dev這個安裝完成后,GTK環境就基本搭建成功,網上有些教程說要安裝其他配置文件,經我親測,發現只要安裝 libgtk2.0-dev 這個包就能搞定。__________________________第4頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142813內容一:熟悉和理解 Linux編程環境3.1 內容要求1)編寫一個C程序,實現文件拷貝功能2)編寫一個C程序,使用Linux下的圖形庫,分窗口顯示三個并發進程運行;3.2 設計過程及實現1)文件拷貝:①文件的拷貝主要的思想就是利用文件指針操作,在兩個文件之間進行按字符fget和fput。從而完成整個文件的拷貝操作。在這個基本功能之外,需要增加程序的健壯性,具體有以下幾個方面:·源文件是否存在且能讀取數據;·是否能創建目的文件,且能向里面寫入數據;·程序需要的argc參數個數是否滿足要求;②基于以上幾點和內容要求,主要的程序段如下:if(argc!=3) //判斷參數個數是否為 3,否則返回{printf("Errorinargc!\n");return0;}if((fsource=fopen(argv[1],"rb"))==NULL){printf("Errorinopensourcefile!\n"); //判斷源文件是否能打開和讀出return0;}if((ftarget=fopen(argv[2],"wb"))==NULL){printf("Errorinopentargetfile !\n"); //判斷目的文件時候能創建和寫入return0;}while((c=fgetc(fsource))!=EOF){fputc(c,ftarget); //按字符讀取和寫入數據}__________________________第5頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281③執行結果如下:將source/source.txt 文件拷貝到到target.txt, 開始時如下圖3-1所示:3-1復制開始前source/source.txt文件內容利用mycopy程序復制,查看 target.txt 文件復制結果如下圖 3-2所示:3-2復制后target.txt文件的具體內容2)實現三個進程之間的并發程序:這里需要用到課程實驗時的 fork() 程序以及GTK的圖形顯示。①基本fork()程序,調用顯示一個父進程和兩個子進程的結構如下:if((pid_1=fork())==0){printf("Child1#isrunning\n");show(argc,argv,"ThisisChild1#");
//第一個子進程 Child1#//調用函數顯示窗口}else{if((pid_2=fork())==0){printf("Child2#isrunning\n");show(argc,argv,"ThisisChild2#");
//第二個子進程 Child2#//調用函數顯示窗口}else{printf("Parent#isrunning\n");
//父進程
Parent#//由于父進程需要顯示全部子進程
PID,所以這里直接用參數畫窗口}__________________________第6頁
/共29
頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281}②調用GTK顯示窗體函數模塊的結構:voidshow(intargc,char*argv[],char*title)
{gtk_init(&argc,&argv); //初始化工具包并且獲取命令行參數window=gtk_window_new(GTK_WINDOW_TOPLEVEL);// 創建新的窗口
;
;//設定窗口的位置
;gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//監聽窗口的 destroy事件;g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(destroy_progress),NULL);gtk_window_set_title(GTK_WINDOW(window),title);// 用來設定更改窗口標題gtk_container_set_border_width(GTK_CONTAINER(window),20);// 設定寬度
;
;使用gtk_vbox_new函數建立縱向組裝盒;為了顯示構件,必須將構件放入組裝盒中,并將組裝盒放在窗口內;vbox=gtk_vbox_new(FALSE,10);gtk_container_set_border_width(GTK_CONTAINER(vbox),100);// 設定寬度;gtk_container_add(GTK_CONTAINER(window),vbox);gtk_widget_show(vbox);//使用gtk_box_pack_start 函數將構件放到組裝盒中 ;sprintf(id_char,"%s,MyID:%d",title,getpid());label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,10);gtk_widget_show(label);
//顯示
PID
號sprintf(id_char,"父進程ID:%d",getppid());
//顯示
PPID號label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,10);gtk_widget_show(label);button=gtk_button_new_with_label("close");
//關閉窗口按鈕信號登記函數,監聽按鈕的clicked事件。//當窗口clicked時, gtk_widget_destroy 就會被調用。//而gtk_widget_destroy 函數又調用 gtk_main_quit() 結束程序運行。g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK(gtk_widget_destroy),window);gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,10);GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);gtk_widget_grab_default(button);函數顯示窗口中的組件gtk_widget_show(button);__________________________第7頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281gtk_widget_show(window);//準備將窗口和所有的組件顯示在屏幕上,函數必須在 GTK程序的最后調用 .gtk_main();}③編譯代碼forkgtk.c,運行;編譯命令為:gcc-oforkgtkforkgtk.c`pkg-config--cflags--libsgtk+-2.0`程序運行結果如下圖 3-3所示:圖3-3三個并行顯示窗口__________________________第8頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281內容二:掌握添加系統調用的方法4.1 內容要求1)采用編譯內核的方法,添加一個新的系統調用。2)編寫一個應用程序,測試新添加的系統調用。3)系統調用的功能:文件拷貝。4.2 設計過程及實現在這一個部分,投入了比較多的時間。總結起來,主要有這么幾個方面:linux內核版本的不同,linux2.X和linux3.X直接添加系統調用和重新編譯內核的方法有差異,甚至linux2.X之間,內核文件也有變化。·再加上相關資料的步驟和方法不盡相同,甚至還有互斥的步驟,這就使得這個推進比較漫長。我之前的Ubuntu版本是13.04,后來發現因為是64位的,行不通,只好換了一個低版本的 Ubuntu11.10,經過自己的實際工作,下面是在運行成功之后,總結的一個過程。(環境和內核配置見本報告第二部分)1)修改Makefile文件,修改系統版本后綴:如下圖4-1所示:這里加的是本人的姓名的首字母,以示區分。__________________________第9頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142814-1修改Makefile文件版本(2)修改/usr/src/ linux-source-3.0.0/kernel/ 目錄下的sys.c文件,在最后加入新的系統調用,拷貝函數實現。如下所示:asmlinkageintsys_zcycopyfile(constchar*s_file,constchar*t_file){constintBUF_SIZE=512;intfin,fout;charbuf[BUF_SIZE];intcopy_count;mm_segment_tfs;
//段操作的初始化fs=get_fs();set_fs(get_ds());/* 系統調用打開源文件,若失敗,返回if((fin=sys_open(s_file,O_RDONLY{
-1*/,S_IRUSR))==-1)return-1;printk("Errorinoensourcefile!");}/* 系統調用創建并打開目標文件,若失敗,返回 -2*/if ((fout = sys_open(t_file,O_RDWR | O_CREAT
|
O_TRUNC,S_IRUSR
|S_IWUSR))==-1){return-2;printk("Errodinopentargetfile!");}while(copy_count=sys_read(fin,buf,BUF_SIZE)){ /* 拷貝文件,若失敗,返回 -3*/if(copy_count==-1||sys_write(fout,buf,copy_count)==-1){return-3;printk("Errorincopyfile!");}}set_fs(fs);
/*
段操作結束
*/return0;}(3)修改
/usr/src/
linux-source-3.0.0
/arch/x86/include/asm/
文件夾下面頭文件:unistd_32.h
,在文件的系統調用號部分添加一個新的系統調用
,具體添加行如下:#define__NR_sys_zcycopyfile 347__________________________第10頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281同時把下面的總調用號加 1,變成348。具體截圖如下圖 4-2所示。圖4-2添加系統調用號(4)修改/usr/src/linux-source-3.0.0/x86/kernel/syscall_table_32.s ,①加入新的一行:.longsys_zcycopyfile /*347*/②具體實現如下圖 4-3所示:__________________________第11頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281圖4-3填寫系統調用入口表③當用戶程序需要系統提供服務的時候, 比如347號調用sys_zcycopyfile,就會通過系統調用產生一個 int0x80 的軟中斷,就會進入到系統調用的入口函數,找到這個調用函數表查找入口函數, 也就是這里的.long sys_zcycopyfile ,進而在
sys.c
中找到具體的函數實現
asmlinkageintsys_zcycopyfile(constchar*s_file,constchar*t_file)
,從而實現系統調用。5)配置內核:(先cd到下載的新的內核包)①凈化解壓后的源代碼makemrproper②安裝ncurses環境:apt-getinstalllibncurses5-devncurses是一個能提供基于文本終端窗口功能的動態庫 ,提供字符終端處理庫,包括面板和菜單。③對內核選項進行配置makemenuconfig執行命令之后,會彈出一個框,提示對內核裁剪或配置。這次用不到變化內核模塊,直接用鍵盤方向鍵選 <EXIT>項就行了。④建立模塊間的依賴信息make dep__________________________第12頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281這一步正常情況會提示用戶多此一舉⑤刪除配置時留下的一些不用的文件make clean這一步一般沒動作,除非是失敗后再次編譯內核時要用到。6)編譯內核:①編譯內核文件bzImage:makebzImage–j9這一步耗費的時間比較長,所以加了一個-j9,這種方法使用多線程編程,實際使用時發現能很大的提高效率。(這個視CPU而定,要看CPU最多支持幾個線程)②編譯內核模塊:makemodules –j97)安裝內核經過最麻煩的編譯內核,接下來的安裝內核就顯得容易多了,輸入命令sudomakemodules_install
安裝內核模塊sudomakeinstall
安裝內核同樣,如果嫌時間太慢的話,同樣可以在最后加上 –j98)環境修改:接下來主要是將編譯安裝生成的操作系統讓系統引導程序“知道”,具體過程如下圖4-4所示:圖4-4 環境修改具體如下:①復制內核到boot目錄:__________________________第13頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281cparch/i386/boot/bzImage
/boot/vmlinuz-3.0.69.zcy可利用
Tab快速補全路徑和文件,這樣方便又不容易出錯。②建立要載入
ramdisk
的映像文件mkinitramfs3.0.69.zcy-o/boot/initrd.img-3.0.69-zcy③更新啟動項文件 grub2.conf,直接輸入命令update-grub2 就行。(9)最后需要修改/boot/grub/ 目錄下grub.cfg 文件;進入文件之后,按Ctrl+F 查找timeout ,將所有的timeout數值改為100;這個數值的單位是秒,這么做的目的是修改啟動項的暫停時間,以便讓用戶有足夠的時間選擇要進入的操作系統。(10)重啟,進入新系統:啟動項如下圖 4-5所示:圖4-5系統啟動項※原版本內核比新內核小,入口在 PreviousLinuxversion 目錄下,如下圖4-6所示:以上做的工作相當于在添加新的系統調用的同時還更新了系統。__________________________第14頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142814-6舊的系統入口顯示11)進入新系統之后,輸入命令uname–a/-r查看系統新版本:執行情況如下圖4-7所示。可知已經成功的進入到修改后的新內核 3.0.69.zcy4-7顯示新內核信息12)編寫測試程序zcopy.c,如下圖4-8所示:__________________________第15頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142814-8測試程序,檢測新的第347號系統調用13)編譯運行,生成執行文件。然后看執行程序是否可以實現文件的拷貝,執行結果如下圖4-9和圖4-10所示,可看到已經成功的實現了預計的功能。圖4-9 執行程序__________________________第16頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281圖4-10程序執行顯示結果__________________________第17頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281內容三:掌握添加設備驅動程序的方法5.1 內容要求1)采用模塊方法,添加一個新的設備驅動程序。2)要求添加字符設備的驅動。3)編寫一個應用程序,測試添加的驅動程序5.2 設計過程及實現1)Linux內核中的設備驅動程序是一組常駐內存的具有特權的共享庫,是低級硬件處理例程。對用戶程序而言,設備驅動程序隱藏了設備的具體細節,對各種不同設備提供了一致的接口,一般來說是把設備映射為一個特殊的設備文件,用戶程序可以象對其它文件一樣對此設備文件進行操作。Linux支持3種設備:字符設備、塊設備和網絡設備。設備由一個主設備號和一個次設備號標識。主設備號唯一標識了設備類型,即設備驅動程序類型,它是塊設備表或字符設備表中設備表項的索引。次設備號僅由設備驅動程序解釋,一般用于識別在若干可能的硬件設備中,I/O請求所涉及到的那個設備。一個典型的驅動程序,大體上可以分為這么幾個部分:①注冊設備:在系統初啟,或者模塊加載時候,必須將設備登記到相應的設備數組,并返回設備的主設備號;②定義功能函數:對于每一個驅動函數來說,都有一些和此設備密切相關的功能函數。以最常用的塊設備或者字符設備來說,都存在著諸如 open()、read()這一類的操作。當系統調用這些調用時,將自動的使用驅動函數中特定的模塊。 來實現具體的操作;③卸載設備:在不用這個設備時,可以將它卸載,主要是從/proc中取消這個設備的特殊文件。__________________________第18頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142812)編寫Makefile文件如下:ifneq($(KERNELRELEASE),)obj-m:=zcydriver.o //obj-m表示編譯連接后將生成elsePWD:=$(shellpwd) //PWD為當前目錄KVER:=$(shelluname-r) //KVER為當前系統內核版本
zcydriver.o
模塊KDIR:=/lib/modules/$(KVER)/buildall:$(MAKE)-C$(KDIR)M=$(PWD) //調用內核模塊編譯clean:#rm-f*.cmd*.o*.mod*.korm-rf.*.cmd*.o*.mod.c*.ko.tmp_versions$(MAKE)-C$(KDIR)M=$(PWD)cleanendif調用Makefile文件之后,其具體過程如下:①KERNELRELEASE是在內核源碼的頂層 Makefile中定義的一個變量,在第一次讀取執行此 Makefile時,KERNELRELEASE沒有被定義,所以 make將讀取執行else之后的內容;②如果make的目標是clean,直接執行clean操作,然后結束。③當make的目標為all時,-C$(KDIR)指明跳轉到內核源碼目錄下讀取那里的Makefile;M=$(PWD)表明然后返回到當前目錄繼續讀入、執行當前的Makefile。④當從內核源碼目錄返回時,KERNELRELEASE已被定義,內核的build程序Kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句,指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名。__________________________第19頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281(3)編寫設備功能函數:(zcydriver.c)函數框架如下所示:#defineMY_MAJOR240
//定義設備號intzcydriver_open(structinode*inode,structfile*filp)
//打開設備ssize_tzcydriver_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos) //讀數據{sprintf(s2,"%s",s1);if(count<12){if(!copy_to_user(buf,s2,count)) { return0; }}else{if(!copy_to_user(buf,s2,strlen(s2))) { return0; }}return-1;}ssize_tzcydriver_write(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos) //寫數據{if(count<0)if(s1==NULL)if(copy_from_user(s1,buf,count+1))returncount;
return-EINVAL;return-ENOMEM;return-EFAULT;}intzcydriver_release(structinode*inode,structfile*filp) //釋放設備structfile_operationszcydriver_fops={.owner=THIS_MODULE,.open=zcydriver_open,.read=zcydriver_read,.write=zcydriver_write,.release=zcydriver_release,
//};__________________________第20頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281staticintzcydriver_init(void){
//設備初始化rc=register_chrdev(MY_MAJOR,"zcydriver",&zcydriver_fops);if(rc<0){
//注冊printk("...register%s
deverror\n","zcydriver");
//失敗返回錯誤return-1;}printk("...registerzcydriverdevOK\n");return0;
//成功注冊設備}staticvoidzcydriver_exit(void){unregister_chrdev(MY_MAJOR,"zcydriver");printk("...GoodBye!\n");
//注銷設備}MODULE_LICENSE("GPL");module_init(zcydriver_init);module_exit(zcydriver_exit);(4)設備加載,安裝過程如下:①進入Makefile 文件和zcydriver.c 文件所在目錄,清除make產生的殘留文件。命令為:make clean②刪除先前可能加載過的模塊,命令為:rmmod /dev/zcydriver③卸載設備:rm /dev/zcydriver④編譯設備文件,產生模塊文件make⑤加載模塊__________________________第21頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281insmod zcydriver.ko⑥加載設備,分配設別號mknod /dev/zcydriverc2400⑦更改用戶對設備的操作權限為可讀、可寫chmod 666/dev/zcydriver5)運行測試程序,檢驗設備是否可讀寫:檢測程序見報告附錄的源代碼,測試過程如下圖5-1所示:圖5-1設備測試結果__________________________第22頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U2010142816.內容四:理解和分析/proc文件6.1 內容要求(1)了解/proc
文件的特點和使用方法。(2)監控系統狀態,顯示系統中若干部件的使用情況。(3)用圖形界面顯示系統監控狀態。6.2 設計過程及實現(1)/proc
文件特點:①Linux的proc文件系統是進程文件系統和內核文件系統的組成的復合體,是將內核數據對象化為文件形式進行存取的一種內存文件系統,是監控內核的一種用戶接口。它擁有一些特殊的文件(純文本) ,從中可以獲取系統狀態信息。②/proc/cpuinfo保存CPU信息,包括名稱、型號、數目、主頻、 Cache等;/proc/version保存操作系統信息,包括系統版本、內核型號、 GCC版本等;/proc/stat保存CPU活動信息數據,用來測算 CPU使用率;/proc/meminfo保存內存空間和交換空間實時大小,可用來計算內存和交換分區使用率,MemTotal表示內存空間總大小,MemFree表示內存剩余空間大小,SwapTotal表示交換分區總大小,SwapFree表示交換分區剩余空間大小。據此可以算出內存和交換分區的使用率。2)設計實現系統監控器——ManagerCat①結構如下圖6-1所示:圖6-1監控器結構__________________________第23頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281②系統信息頁→運行效果如下圖 6-2所示:圖6-2系統信息頁效果→核心代碼結構如下:vbox=gtk_vbox_new(FALSE,0);
//新建容器frame=gtk_frame_new(bufferf1);
//新建標簽頁label=gtk_label_new(bufferf1);
//新建文本框,其余兩個類似gtk_container_add(GTK_CONTAINER(frame),label);//之后填入相應的值gtk_notebook_append_page(GTK_NOTEBOOK(notebook),vbox,label);③進程信息頁:→運行效果如下圖 6-3所示:__________________________第24頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281圖6-3系統信息頁效果→核心代碼結構如下:sprintf(bufferl,"進程信息");hbox=gtk_hbox_new(FALSE,5);scrolled_window=gtk_scrolled_window_new(NULL,NULL);//
滾屏gtk_widget_set_size_request(scrolled_window,300,300);clist=gtk_clist_new(5);//5listsget_proc_info(clist,&p,&q,&r,&s);
//得到進程信息gtk_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); //回調函數,響應行選擇gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),clist); //滾屏vbox=gtk_vbox_new(FALSE,5);frame=gtk_frame_new(bufferl);gtk_widget_set_size_request(frame,100,215);label=gtk_label_new(bufferf1);gtk_container_add(GTK_CONTAINER(frame),label);gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,10);button1=gtk_button_new_with_label("結束進程");g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(kill_proc),"結束進程"); //殺死進程回調函數gtk_box_pack_start(GTK_BOX(vbox),button1,FALSE,FALSE,10);button2=gtk_button_new_with_label(" 刷新");g_signal_connect_swapped(G_OBJECT(button2),"clicked",G_CALLBACK__________________________第25頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281(refresh),clist); //按鈕回調,刷新屏幕gtk_box_pack_start(GTK_BOX(vbox),button2,FALSE,FALSE,10);gtk_widget_show_all(hbox);gtk_notebook_append_page(GTK_NOTEBOOK(notebook),hbox,label);__________________________第26頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281④模塊信息頁:→運行效果如下圖 6-4所示:圖6-4模塊信息頁效果→核心代碼結構如下:sprintf(bufferl,"模塊信息");vbox=gtk_vbox_new(FALSE,0);scrolled_window=gtk_scrolled_window_new(NULL,NULL);gtk_widget_set_size_request(scrolled_window,500,250);gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);clist2=gtk_clist_new(3); //滾屏和列get_module_info(clist2);gtk_signal_connect(GTK_OBJECT(clist2),"select_row",GTK_SIGNAL_FUNC(select_row_callback2),NULL);gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),clist2);gtk_box_pack_start(GTK_BOX(vbox),scrolled_window,TRUE,TRUE,5);hbox=gtk_hbox_new(FALSE,0);button3=gtk_button_new_with_label("
刷新");
//刷新按鈕g_signal_connect_swapped(G_OBJECT(button3),"clicked",G_CALLBACK(refresh2),clist2);gtk_widget_show_all(vbox);__________________________第27頁/共29頁計算機科學與技術學院 操作系統課程設計實驗報告 U201014281label=gtk_label_new(bufferl);gtk_notebook_append_page(GTK_NOTEBOOK(notebook),vbox,label);⑤內存信息頁:→運行效果如下圖 6-5所示:圖6-5內存信息頁效果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇科技大學《風景園林快題設計》2023-2024學年第二學期期末試卷
- 石家莊醫學高等專科學校《海洋生物動力學》2023-2024學年第二學期期末試卷
- 山東科技職業學院《中國文化概論》2023-2024學年第二學期期末試卷
- 西藏職業技術學院《醫學微生物學及檢驗技術》2023-2024學年第二學期期末試卷
- 南京理工大學《英語句法學》2023-2024學年第二學期期末試卷
- 黑龍江民族職業學院《診斷腹部檢查》2023-2024學年第二學期期末試卷
- 催收公司營銷活動方案
- 兒童kfc活動方案
- 兒童樂園營銷活動方案
- 兒童體驗塔吊活動方案
- DB3301T 0286-2019 城市綠地養護管理質量標準
- 注冊安全工程師《道路運輸安全》考點速記手冊
- 設備年度維護保養計劃表
- 文本無創呼吸機
- 水下混凝土灌注記錄(含計算公式新表格)
- 水質監測系統建設方案
- 小學四年級英語下冊期末的復習計劃(精選6篇)
- NBT-31084-2016風力發電場項目建設工程驗收規程(A.監理基本用表)
- 國電智深DCS系統培訓PPT課件
- 混凝土結構及砌體結構課程設計(共18頁)
- 家長在高考動員會講話3篇
評論
0/150
提交評論