操作系統(tǒng)課程設(shè)計報告材料_第1頁
操作系統(tǒng)課程設(shè)計報告材料_第2頁
操作系統(tǒng)課程設(shè)計報告材料_第3頁
操作系統(tǒng)課程設(shè)計報告材料_第4頁
操作系統(tǒng)課程設(shè)計報告材料_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

實用文檔實用文檔舉申彳*扶衣茅課程設(shè)計報課程名稱:操作系統(tǒng)原理院 系:專業(yè)班級:學(xué) 號:姓 名:指導(dǎo)教師:完成時間:計算機(jī)科學(xué)與技術(shù)CS140U2014142017年3月11日實用文檔實用文檔實用文檔實驗?zāi)康膶嶒灜h(huán)境實驗容.3.43.5實驗一 實驗二 實驗三 實驗四 實驗五(選做)4設(shè)計與實現(xiàn)4.4實驗一實驗二實驗三實驗四5心得體會1114實驗?zāi)康?掌握Linux操作系統(tǒng)的使用方法;-了解Linux系統(tǒng)核代碼結(jié)構(gòu);-掌握實例操作系統(tǒng)的實現(xiàn)方法;實驗環(huán)境本次課程設(shè)計采用的操作系統(tǒng)環(huán)境是windowslO、Ubuntu雙系統(tǒng),Ubuntu系統(tǒng)版本號為16.04,核版本號為linux444;前兩個實驗在當(dāng)前Ubuntu環(huán)境下完成,后兩個實驗在win10下虛擬機(jī)VirtualBox的Ubuntu15.10(核為linux4.2.0-42 )中完成。3實驗容3.1實驗一要求熟悉和理解Linux下的編程環(huán)境。(1)(QT/GTK實時監(jiān)測編寫一個C程序,用fread、fwrite(1)(QT/GTK實時監(jiān)測編寫一個C程序,使用基于文本的終端圖形編程庫 (curses)或圖形界面,分窗口顯示三個并發(fā)進(jìn)程的運行(一個窗口實時顯示當(dāng)前時間,一個窗口CPU的利用率,一個窗口做1到100的累加求和,刷新周期分別為1秒,2秒和3秒)。3.2實驗二要求掌握添加系統(tǒng)調(diào)用的方法,采用編譯核方法,添加一個新的系統(tǒng)調(diào)用,實現(xiàn)文件拷貝的功能,另外編寫一個應(yīng)用程序,測試新增加的系統(tǒng)調(diào)用。3.3實驗三掌握增加設(shè)備驅(qū)動程序的方法。采用模塊方法,添加一個新的字符設(shè)備驅(qū)動程序,實現(xiàn)打開/關(guān)閉,讀/寫等基本操作。另外編寫一個應(yīng)用程序,測試新添加的驅(qū)動程序。3.4實驗四要求理解和分析/proc文件。(1)了解/proc文件的特點和使用方法;(2) 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)部件的使用狀態(tài);(3)用圖形界面實現(xiàn)系統(tǒng)監(jiān)控狀態(tài),包括CPU和存利用率、所有進(jìn)程信息等(可自己補(bǔ)充、添加其他功能);3.5實驗五(選做)要求理解和掌握文件系統(tǒng)的設(shè)計方法(選做)。設(shè)計、實現(xiàn)一個模擬的文件系統(tǒng)。包括文件/目錄創(chuàng)建/刪除,目錄顯示等基本功能(可自行擴(kuò)充文件讀/寫、用戶登錄、權(quán)限控制、讀寫保護(hù)等其他功能)。4設(shè)計與實現(xiàn)4.1實驗一4.1.1實驗要求要求熟悉和理解Linux下的編程環(huán)境。4.1.2實驗設(shè)計及調(diào)試(1)編寫一個C程序,其容為實現(xiàn)文件拷貝的功能。這個實驗的思路是聲明兩個文件指針*fp_read和*fp_write,前者用來打開要讀的文件,后者打開要寫的文件,再創(chuàng)建一個1000個字節(jié)大小的緩沖區(qū)buff[],然后調(diào)用fread將容從文件1讀到buff里,再調(diào)用fwrite把容從buff寫到文件2中。這個實驗重點要掌握fread和fwrite的使用方法,注意它們的參數(shù)和返回值。代碼見附件中源碼。實驗結(jié)果如下圖 4.1:■?'、.'、t>X J ■ ,-1. '■14、4 r-d.t■?:?中豐;?T』rG?r百;「「?J■>B^illlTG1 j!〔J;■PR中W:"一兵皓,草治,電甩或6施劃3誼1£看悴札礴駆営號與垂臥菠電干塔術(shù)i:ft淡一「))I0罕:1,曝*(?嵐網(wǎng)講ifi亟廉.墟孔冋滇Jfl三蟲喝電列扎I辺=2咗更盯!習(xí)牴兩>?艮《蘿敬頑SSJH.t人日構(gòu)旳齊嘆珂?林時平好1.側(cè)陰丹,琵去三”.」.?+?「"世行咼一盂:拱此旳汪汕?不矽i”干萬X能再;S若’恨列于青羽豈 事爭示■(考前?丟左右?guī)岳ぃ? 甲氐進(jìn)訐齡后?S化.I4.1運行之前圖運行./Iab1_1text1.txttext2.txt后結(jié)果如下圖4.2:■.■■II■-i1r-■-■1-■11-1“Wf卜*閘可-r曲tJ■4■:ri■R:一 *開mi〒 Pl'.^~i和《葉=?S諸,裁筑咆&毬口躺用la論as圖晦52迪C號鬥》?中6尹祁M:Sir-,as,政雷邨5?0旳畑1£3舌《肌呼強(qiáng)】農(nóng)信即3慕婕:《屯革戊用ffiijt-niis半-『臨耳謨示直帛:1一課本ta哉同濟(jì)五五堆,$吉%同:?^甲三戔,曲車浙丸版》…心陽文廠:卉陽5習(xí)捋1.3*(?a可:齊SS匪,敗代同濟(jì)電三師,H6辛-7.臨丈燈帝》CH??EVSin宰部分,0丸當(dāng)盤京?^對代S甘不Hl鮭代部H,李比樂;城耳呂南)「【RfiasSS和!a宰st分,*人目跡旳戰(zhàn)件部分不妊:??代!》廿.先當(dāng)血--」.5?“2一”辺行鶴二遍丄邂召再詡?cè)?R勺注gfers通.不*1藝.干壯申Mi丈,--」一対“A”ia行弟二走,;皚后再第三《?此時注ssazs迓萬平走即犧畐,找同乎畀明白i■■■4.^李永樂i老hLO天S右?guī)圆弧鲆?不斥平SffiiSS, 白)…華永樂左卓醛W-(吉燦汕丟左英苗r圖4.2運行之后圖由上圖可見text1.txt成功拷貝至text2.txt(2)編寫一個C程序,本次實驗使用的是圖形界面GTK分窗口顯示三個并發(fā)進(jìn)程的運行(一個窗口實時顯示當(dāng)前時間,一個窗口實時監(jiān)測CPU的利用率,一個窗口做1到100的累加求和,刷新周期分別為1秒,2秒和3秒)。這個實驗要用到gtk,首先要配置gtk,在終端中輸入:sudoapt-getinstalllibgtk2.0-dev涉及到3個進(jìn)程的并發(fā),所以要調(diào)用函數(shù)fork來創(chuàng)建3個進(jìn)程。我的思路是在這3個進(jìn)程中分別創(chuàng)建一個線程,去完成相應(yīng)的功能:顯示當(dāng)前時間,監(jiān)測CPU利用率,做累加求和。分別通過函數(shù)voidhavetimeO、voidcpu_usage()、voidadd()實現(xiàn),在main函數(shù)里,初步畫出3個進(jìn)程相應(yīng)的界面。具體的是調(diào)用gtk_window_new()函數(shù)創(chuàng)建一個窗口、gtk_window_set_title()設(shè)置窗口標(biāo)題、gtk_window_set_position 設(shè)置窗口在屏幕的位置、gtk_label_new()創(chuàng)建一個標(biāo)簽用來顯示文本、gtk_container_add ()把標(biāo)簽添加到窗口中、 gtk_widget_show_all()來展示需要展示的控件。例如創(chuàng)建第一個線程:g_thread_create((GThreadFunc)havetime,NULL,FALSE,NULL);通過在線程havetime()中實時更新標(biāo)簽label的容,然后在main()中創(chuàng)建的窗口中展示來完成所要求的功能。進(jìn)程2和3所要求的功能也是通過這種方法實現(xiàn)。注意用到gtk的編譯命令與以往不同,為:gcc-oIab1_2Iab1_2.c'pkg-config--cflags--libsgtk+-2.0'代碼見附件中的源碼,實驗結(jié)果如下圖 4.3:childJ136+17=liichildJ136+17=lii圖4.3運行結(jié)果圖小插曲:在調(diào)用sprintf(s,"CPU 利用率為%f%%,usage)想把利用率的“%拷進(jìn)緩沖區(qū)s后打印出來時,一個百分號是不能夠打印出來的,要寫兩個 %如想要打印兩個%,則要寫4個%以此類推。4.2實驗二4.2.1實驗要求要求掌握添加系統(tǒng)調(diào)用的方法,采用編譯核方法,添加一個新的系統(tǒng)調(diào)用,實現(xiàn)文件拷貝的功能,另外編寫一個應(yīng)用程序,測試新增加的系統(tǒng)調(diào)用。4.2.2實驗設(shè)計及調(diào)試(1)下載一個核https://./pub/linux/kernel/v4.x/下載linux-4.4.4.tar.gz在/usr/src/ 目錄下解壓(用超級用戶權(quán)限),(2)編寫新的系統(tǒng)調(diào)用程序用戶空間所使用的open、read、write、close函數(shù)此時對應(yīng)核函數(shù)為sys_open、sys_read、sys_write、sys_close。首先通過sys_open()打開源文件和目標(biāo)文件,分別返回文件描述符source和dest,然后把當(dāng)前的用戶地址圍保存在 fs,再把當(dāng)前存訪問地址圍設(shè)置為核的存地址訪問圍,再通過sys_read()把源文件容寫到buf,再用sys_write()把buf容寫到dest,接著用sys_close()來關(guān)閉文件,最后再把存訪問地址圍設(shè)置為用戶的。保存fs是避免使用的緩沖區(qū)超過了用戶空間的地址圍而報錯。把自己寫的這個系統(tǒng)調(diào)用程序添加至 /usr/src/linux-4.4.4/kernel目錄下的sys.c最后。(3)添加系統(tǒng)調(diào)用號在/usr/src/linux-444/arch/x86/entry/syscallssyscall_64.tbl 文件,添加一個自己的調(diào)用程序的系統(tǒng)調(diào)用號,我的之前用到了325好,所以添加326號,如下:目錄下修改326commonmysyscall(4)添加系統(tǒng)調(diào)用程序的聲明sys_mysyscall在/usr/src/linux-4.4.4/include/linux目錄下的syscalls.h 最后加上自己添加的系統(tǒng)調(diào)用程序的聲明如下:asmiinkageintsys_mysyscall(char*sourceFile,char*destFile);(5)編譯、安裝核在/usr/src/linux-4.4.4在/usr/src/linux-4.4.4目錄下對核選項進(jìn)行配置:sudomakemenuconfignjvl滬 n^ihui.<fniiier> -■>farptipEy ■i(. anehotkey%. 甲include?.加 .小上 螢P「e聒^E^cxEsoto lorHertp.c/kfpr L円End:J')built-ingJ軸"闊芒fl nbduH4.yIMAIII^f啊I曲呂qpielfrzt圖4.4核配置圖選擇save后退出接下來就是漫長的編譯核了(4個線程跑會快一些):sudomake-j4大概1個小時左右編譯完畢,再安裝核:安裝核模塊sudomakemodules_install//安裝核模塊sudomakeinstall//安裝核sudomakeinstall//安裝核安裝完畢后重啟,在Ubuntu高級選項中進(jìn)入新的核。(6)編寫系統(tǒng)調(diào)用測試程序#include<sys/syscall.h>#include<unistd.h>intmain(){

syscall(326,"text1.txt","text2.txt");return0;}實驗結(jié)果如下圖4.5:J*1J*113W■:fS中秤壬網(wǎng)啓}I,害+(鬲ST冋rSStifc"k=S代廁?濟(jì)話三曲屜豐窈尢盞:? V.肺宣燈:用研£習(xí)(F杠面訖和範(fàn)辛郃対,亦止翦譯阡和#iftS?廿肝] *;*代郃?T,莘承樂0畔1^?左3 Tt'77邃行拿一£E林咗再*三《,itt時連佇a遼:RS,不H的干萬不能輙S,找冋爭弄境自;…4"學(xué)永于全真i虧加Em天曲汙咗瑚)--?「證出前理,進(jìn)行5后胥叱?氫羊二.裁JE曲翻.人=下片帕?氫羊二.裁JE曲翻.人=下片帕W甲閔,(Ikflfe,至少應(yīng)ft?聲一?HeII:*S火曲交晞憶亡憶A、生反愿亜送?習(xí)?aw帽耶知,闘遵S看總対i狼9人考不軒莫氤it砂ms網(wǎng)讀史130?,亞丹■「犧得沒詢*<后《呢(17」胃肝產(chǎn)皿瀾噪4特ZUtQ,國黃性2d扁”推石<石9就2酣7)...ni.加』間左ff宅卜開眸fifg…大屮帯文址聞&ttins^a關(guān)聲乂?5!畢嗣的,(s((^a力,sj細(xì)再1衲號網(wǎng)?本人士小件文llll暹來丸聲了半』1胡5^=;,B5t4盒.乾誦審蚪不再幸一齊于曄a,亦出酣巨、ft習(xí)(15?聯(lián)£亡單詞r鶴蒂為』i后無氧占:用:札與tK曲說老聽imsa技巧「蠱^推當(dāng)):完曲刃知》廿i*,?■寫女</?作£25*15分禪(悵文干A不詩筑豈啟后煙,3力弓柞五?=立戈?方一WWiHT練”仰帀籃抱文《=豐±主{4石7£*'*4> *壬得*:戊活■=¥1*合1 ?(=7a^SaiJi4>to_lii>jsJ-丹弓iAi?H- 1-'■!. 11. *總戍-rAn二匯.e*rl,1)1-5/圖4.5運行之前的圖./Iab2后如下圖:FS專.任去一門》5??試:斬學(xué)一.電饑?泡桶農(nóng)自訥掙刑理論壩彌!#1廂眸韋<!*呂^章皆甘審干脈^:??-.雖詣.iW詒.FS專.任去一門》?ft<tB7,:業(yè)申*4牡大學(xué)出lifi酌晉書.“以下節(jié)鍛.陽供營考“戡竽:[tn孑E示購評) [1.?+苗)B何?1幫丑甌lift減產(chǎn)*三帆-兀再滾燈話was唐驀>iSeHRKWII部甘』iAaWEF旳tF世切好平薛)-理畑脅,2典樂^■■v?*"^.-a^isizjji(皓衍再需三ii-仙1#%工虧通-平曙rr,.干萬不砥再?*,梅時3明0卜開抬譽J?£.園岀昶1^1"遇帚屆后邇住“英5: _ _單詢業(yè)孌ife*te^”丸三下學(xué)WF學(xué).舛冶《單胡,到』舊怕,S△或3自-一11單間ISIS15業(yè)務(wù)荒15冊le悒P;□#同足英歯學(xué)習(xí)||整》戲那陽』劑聞洙里考Jt章卻《*?酌那甘..戕1■人考養(yǎng)舛礙瀟:{?字S示融;T)].?*(鬣1?^濟(jì)》丑揭,?出杠同器哲三IS?《*石爻號)-.2一W貢燈^<雷6習(xí)F&?>(HSRtt和典軍那罷』謁fS的級世3)甘平籽}- ifiASft£找代詛,顯)■■■)Tt'?-詛訐砰二1*護(hù)右S莫21?UMtfeOS-不3対,子萬不麗SWS.扌炯T穴刑□: *.蘿匝樂亍HM.jJh代flflM,天吁舀開制6JT.*4出霸魚謎盲翻胡也S遴:單?。?1^削41童黑的.*=T*BIF學(xué).別7舊》,至工應(yīng)茂49走一連單間弗5竝另勘?尺退心)O*詞是黃說字習(xí)寒重》的那時』fflS讀星專點卓丹8星雲(yún)蘆S鉗《*人=^菲肝更臥讀加訂"廠了.M得殳面芒ar, I區(qū)B因巧新曲硏讀更謝h伽了。W謁股心牯《方面旳龍化■看尹如(肝7口晳.9丟ttz£更,MS?石《用22?$>..,I1EB.J理ii,I星《開如帯後【幷7L工惘.誓黃ttz.丄fi,博薦4石茫料衛(wèi)酊t,Kftjntf,可SF宇馬尹ift?<W*J,,龍*4謀交£壽&?島沖割軸R》HH孑[FJ.Sffi曬耳可S開宅石幵曲*?£向充**,対g山建啖?啟,沖刊価859ttf軒陷,囁仿aB|閔fr幻按罕延廳亂將仿干P可遞厠衲村料SKHEZI,疋彌兩衲巧作逵每作,敢畢sit刪檀護(hù)可且氏禹vni5』扌科疽SHE齊”zkksiw?^柞s.V.*人大小杵文加近干只fflT半M呦廳吉,切a悴臺. 旺.*:人大■■卜節(jié)文tiD更坯冃肖了半啣廳札齊哥件吃憊,藝出:SCa 英ffi證料不再*,在亍保咗透,K出弟壁..單詞,《呂昭;半; 鋰習(xí)rr宙*甲當(dāng):單喧I,?后耐;官傑- rnfix占-屈請.號齊“營jj 煥ST■鄭賓咼至ITti■英済奩料不再菲,S習(xí)靜嗣5^:¥占-FEW玉占-SS:±.G烹k tie?-9?f-1.W1sfiA圖4.6運行之后的圖可見系統(tǒng)調(diào)用成功。4.3實驗三4.3.1實驗要求掌握增加設(shè)備驅(qū)動程序的方法。采用模塊方法,添加一個新的字符設(shè)備驅(qū)動程序,實現(xiàn)打開/關(guān)閉,讀/寫等基本操作。另外編寫一個應(yīng)用程序,測試新添加的驅(qū)動程序。4.3.2實驗設(shè)計及調(diào)試(1)添加設(shè)備驅(qū)動原理:linux設(shè)備一般分為:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。驅(qū)動程序運行在核空間,應(yīng)用程序通常通過文件系統(tǒng)接口函數(shù)訪問/dev目錄下的設(shè)備文件來訪問驅(qū)動程序。編寫設(shè)備驅(qū)動程序的主要工作就是編寫file_operations 子函數(shù),這次實驗主要完成的就是file-operations 數(shù)據(jù)結(jié)構(gòu)中個模塊,file_operations的.open\.release\.read\.wnte4結(jié)構(gòu)的每個域都對應(yīng)一個系統(tǒng)調(diào)用。用戶進(jìn)程利用系統(tǒng)調(diào)用在對設(shè)備文件進(jìn)行諸如read/write等操作時,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號找到相應(yīng)的設(shè)備驅(qū)動程序,然后讀取該數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。編寫Makefile文件Makefile文件用于編譯設(shè)備驅(qū)動程序,其容如下:iifeq($(KERNELRELEASE),)KERNELDIR?=/Iib/modules/$(shelluname-r)/buildPWD:=$(shellpwd)modules:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesmodules_install:$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_installclean:rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions.PHONY:modulesmodules_installcleanelseobj-m:=mydev.oendif編寫設(shè)備功能函數(shù)編寫設(shè)備驅(qū)動程序的主要工作就是編寫子功能函數(shù)。open()函數(shù)用來打開一個設(shè)備,在該函數(shù)中可以對設(shè)備進(jìn)行初始化。如果這個函數(shù)被賦值NULL那么設(shè)備打開永遠(yuǎn)成功,并不會對設(shè)備產(chǎn)生影響。release()函數(shù)用來釋放open()函數(shù)中申請的資源,并在文件引用計數(shù)為0時,被系統(tǒng)調(diào)用。其對應(yīng)應(yīng)用程序的close()方法,但并不是每一次調(diào)用close()方法,都會觸發(fā)release()函數(shù),只有在打開的所有設(shè)備文件都釋放后,該函數(shù)才會被調(diào)用?!猺ead()函數(shù)用來從設(shè)備中獲取數(shù)據(jù),成功時返回讀取的字節(jié)數(shù),失敗時返回一個負(fù)的錯誤碼。write()函數(shù)用來寫數(shù)據(jù)到設(shè)備中。成功時該函數(shù)返回寫入的字節(jié)數(shù)。詳細(xì)實現(xiàn)見附件中源碼。(4)設(shè)備驅(qū)動程序安裝①make調(diào)用Makefile編譯設(shè)備驅(qū)動程序圖4.7make圖編譯成功,生成mydev.ko文件makeH=yhone/tanGLl*jel/桌同/Lmbr^ocuL^shemde「s-斗.2.e-42-generic'②sudoinsmodmydev.ko掛載模塊,再查看設(shè)備的主設(shè)備號:cat/proc/devices226248249250251dmmydevbsgwatchdogrtc圖4.8主設(shè)備號的圖可見系統(tǒng)為mydev生成的主設(shè)備號為248③sudo/dev/mydevc2480mydev是設(shè)備文件的名字,“c”是指創(chuàng)建的是字符設(shè)備文件,0是從設(shè)備些 248是主設(shè)備號,k

bscbuscdromcharne3S£圖4.9生成設(shè)備文件圖可見生成了正確的設(shè)備文件mydev(5)測試驅(qū)動程序測試程序?qū)崿F(xiàn)的是先從設(shè)備中讀出里面初始的字符串 U201414813再把一個字符串寫進(jìn)去,然后再讀出來,測試程序詳見附件源碼,測試實驗結(jié)果如下圖:先運行命令執(zhí)行程序:sudo./test串寫進(jìn)去,然后再讀出來,測試程序詳見附件源碼,測試實驗結(jié)果如下圖:先運行命令執(zhí)行程序:sudo./testdevice'srtaneyouwannatousemydevPleeseYnpu士thedevice'srtaneyouwannatousemydevrhedevicewasInlte-dwithastring:U291414813Pledseinputastring:1likeOSlabrhestringInthedevicenowIsitlikeoslabngllwel=VtrTuaiBox:桌面/lab驚|圖4.10結(jié)果圖可見打開、讀、寫均正確。最后執(zhí)行sudormmodmydev來刪除模塊sudorm/dev/mydev來刪除設(shè)備文件4.4實驗四要求理解和分析/proc文件。4.4.1實驗要求了解/proc文件的特點和使用方法;監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)部件的使用狀態(tài);用圖形界面實現(xiàn)系統(tǒng)監(jiān)控狀態(tài),包括CPU和存利用率、所有進(jìn)程信息等(可自己補(bǔ)充、添加其他功能)。4.4.2實驗設(shè)計及調(diào)試這個實驗主要是對/proc文件的理解和對gtk的熟練運用。我用gtk里的筆記本構(gòu)件畫了3個頁面,分別為Pageone、pagetwo、pagethree。pageone:顯示CPU利用率計算和顯示CPUft接用到的實驗一第二個部分的顯示CPU利用率部分,不同的是這兒用到了筆記本控件,要把“Pageone”作為一個button加到notebook上,還要把算出來的CPU利用率作為一個標(biāo)簽容加到notebook上,即:GtkWidget*button4=gtk_label_new(”Pageone");Iabel1=gtk_label_new("begin");// 全局標(biāo)簽gtk_notebook_append_page(GTK_NOTEBOOK(notebook),Iabel1,button4);// 筆記本容器、子控件、標(biāo)題名然后創(chuàng)建一個線程去計算CPU利用率,然后實時更新顯示出來。Pagetwo:顯示所有進(jìn)程信息

用gtk來畫這個界面的邏輯是:最大的邏輯控件是筆記本notebook,把一個hbox添加到notebook里,再把顯示所有進(jìn)程信息的表 clist 添加到一個滾動窗口scrolled_window里,再把這個scrolled_window添加到hbox左邊部分;hbox右邊部分包括一個vbox,這個vbox上面是一個frame來顯示進(jìn)程大致情況,下面是一個button用來刷新進(jìn)程。如下圖4.11:notebookhboxscrolled_windowvboxscrolled_windowvboxclistframeclistbutton圖4.11構(gòu)件分布結(jié)構(gòu)圖clist 中所有進(jìn)程信息是通過 voidget_proc_info(GtkWidget *clist,int*p,int*q,int*r,int*s) 函數(shù)讀出來的,具體就是遍歷/proc文件夾下所有的數(shù)字文件夾,這些數(shù)字文件夾的stat中存放的就是所有進(jìn)程的部分信息,包括:PID、名稱、狀態(tài)、優(yōu)先級、占用存,直接遍歷讀出來后加到 clist中顯示出來。同樣,frame中的總進(jìn)程數(shù)、運行進(jìn)程數(shù)、睡眠進(jìn)程數(shù)、僵尸進(jìn)程數(shù)也都是根據(jù)get_proc_info ()出來,通過voidrefresh(GtkWidget*clist)GtkWidget*button2=gtk_button_new_with_label("g_signal_connect_swapped (G_OBJECT(button2),clist);當(dāng)button2出來,通過voidrefresh(GtkWidget*clist)GtkWidget*button2=gtk_button_new_with_label("g_signal_connect_swapped (G_OBJECT(button2),clist);當(dāng)button2上發(fā)生click事件時就調(diào)用refresh刷新”);完成刷新。"clicked",G_CALLBACK(refresh),完成刷新。pagethree:顯示一些基本的CPU言息這頁就是簡單的創(chuàng)建兩個frame1和frame2來顯示CPU部分信息和操作系統(tǒng)的部分信息。frame1中:CPI名稱通過char*get_cpu_name(char*buf1)函數(shù)獲得,CPU類型通過char*get_cpu_type(char*buf2)函數(shù)獲得,CPU主頻通過char*get_cpu_f(char*bu⑶函數(shù)獲得,這3個信息都是從/proc/cpuinfo中讀出來的,其中涉及到一些簡單的字符串的判斷等操作,在此不加贅述;

frame2中:操作系統(tǒng)名稱是通過char*get_os_type(char*buf1)函數(shù)獲得的,操作系統(tǒng)版本是通過char*get_os_version(char*buf2)函數(shù)獲得的,它們都返回一個緩沖區(qū)指針,用以在主函數(shù)main()中顯示。3個頁面的詳細(xì)代碼見附件中源碼。編譯:gcc-oIab4Iab4.c'pkg-config--cflags--libsgtk+-2.0'執(zhí)行:./Iab4實驗結(jié)果如下圖4.12、4.13、4.14:this^'sIab4?問匸5已PagetwoPagethreeCPU利用率為1.020408%圖4.12第一個頁面圖this'sIab4onePag時twoPagethreePID名稱狀態(tài)優(yōu)先級占用內(nèi)存進(jìn)程信息15ystemd50121212kthreadid£00AUprocess:1573ksoftirqd/0S00Skworker/0:0HS-200Running:2&kworker/uZOs00sleeping:1547rcu_5ched5008rcd_bhS00Zornbied:09rckJos/Os0Q1|it>rcjob/O50011migration/0£0012watchdog/o500刷新13khelp^rS-20014kdevtmpFsS0015netnss=20016peifs-20017khungtaskds00

圖圖4.13第二個頁面圖this'slab4--AboutPageorePagetwoPageth「eeAbout扯理器信息CPU名CPU名fiPJntelCR)Core(TM)iS-4210UClCPUS3S-GenuinelintelCPU45$:1696.331MH2操作系統(tǒng)名稱:Ubuntu15.10操作系統(tǒng)版牟Lirwxversion4.2.0圖4.14第三個頁面圖圖4.14第三個頁面圖Copyright@20l7tangliwei心得體會本次課程設(shè)計,第一個題目第一問很簡單,因為之前在實驗中寫過文件拷貝的程本次課程設(shè)計,第一個題目第一問很簡單,因為之前在實驗中寫過文件拷貝的程序,所以很快就順利實現(xiàn)了,要注意fopen序,所以很快就順利實現(xiàn)了,要注意fopen、剛開始不知怎么做,主要是因為之前沒接觸過fread、fwrite幾個函數(shù)的用法,第二問gtk這種畫界面的環(huán)境,在網(wǎng)上查閱相關(guān)資料后發(fā)現(xiàn)套路都是一樣的,個人覺得把握住gtk中控件的概念,實現(xiàn)簡單的界面都還是比較簡單的,除了gtk,在CPU利用率的計算上還卡了一段時間,主要是沒弄清到底應(yīng)該怎么計算,查了大量資料后找到一種比較簡單的計算方法去實現(xiàn),結(jié)果也很準(zhǔn)確;第二題和第三題是同一類型,都是需要對核、系統(tǒng)調(diào)用、設(shè)備驅(qū)動文件有很

好的理解才能很快做出來,自己還掌握得不是很好,所以也花了不少的時間去查資料、實現(xiàn)要求的功能,但現(xiàn)在回過頭來看收獲很大,對課上所學(xué)的部分容有了更加深刻的理解,對linux系統(tǒng)調(diào)用和設(shè)備文件有了更深的認(rèn)識;第四題確實是花的時間最多的,因為不僅涉及到復(fù)雜的gtk運用,還包括對/proc文件的理解,這兩方面都是查了大量資料后才一點點完成的,時間花了,確實也有了成效,看到自己畫的界面和讀出的進(jìn)程、CPU信息,成就感瞬間爆棚,但這還遠(yuǎn)遠(yuǎn)不夠,相信以后學(xué)習(xí)工作中還會遇到更加困難的類似的問題,這次課設(shè)只是打下了個小小的基礎(chǔ),任重道遠(yuǎn)!總之,這次課設(shè)受益匪淺。實用文檔實用文檔實用文檔6附錄(源碼)實驗一:第一題:#include<stdio.h>#definebuffersize1000intmain(intargc,char*argv[]){if(argc!=3){//輸入3個參數(shù)printf("inputerror!\n");return0;}charbuff[buffer_size]={0};intnread=0;FILE*fp_read=NULL;FILE*fp_write=NULL;if((fp_read=fopen(argv[1],"rb"))==NULL){//緩沖區(qū)初始化為’\0'printf("can'topen%s",argv[1]);return1;}if((fp_write=fopen(argv[2],"wb"))==NULL){printf("can'topen%s",argv[2]);return1;}while((nread=fread(buff,sizeof(char),buffer_size,fp_read))>0)//nreadfwrite(buff,sizeof(char),nread,fp_write);fclose(fp_read);fclose(fp_write);return0;}第二題:#include<gtk/gtk.h>#include<time.h>#include<unistd.h>實際讀到字符數(shù)GtkWidget*window;GtkWidget*label;voidhavetime(){inti;for(;;i++){time_ttimer=time(NULL);chars[1000]={0};格式化字符串寫入s格式化字符串寫入ssleep(1);gdk_threads_enter();gtk_label_set_text(GTK_LABEL(label),s);gdk_threads_leave();}""}voidcpu_usage(){FILE*fp;charcpu[5];charbuff[1000]={0};chars[1000]={0};longintuser,nice,sys,idle,iowait,irq,softirq;longints1,s2,idle1,idle2;floatusage;while(1){fp=fopen("/proc/stat","門;if(fp==NULL){perror("fopen”);exit(0);//從文件結(jié)構(gòu)體指針中讀取數(shù)據(jù)//從文件結(jié)構(gòu)體指針中讀取數(shù)據(jù)fgets(buff,sizeof(buff),fp);sscanf(buff,"%s%d%d%d%d%d%d%d",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&so1tirq);s1=user+nice+sys+idle+iowait+irq+softirq;idle1=idle;rewind(fp);sleep(1);//memset(buff,0,sizeof(buff));//cpu[0]='\0';user=nice=sys=idle=iowait=irq=softirq=0;fgets(buff,sizeof(buff),fp);sscanf(buff,"%s%d%d%d%d%d%d%d",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);s2=user+nice+sys+idle+iowait+irq+softirq;idle2=idle;usage=(float)(s2-s1-(idle2-idle1))/(s2-s1)*100;sprintf(s,"CPU 利用率為%f%%",usage);gdk_threads_enter();gtk_label_set_text(GTK_LABEL(label),s);gdk_threads_leave();fclose(fp);sleep(1);}}voidadd(){intj=1;intsum=0;intsum1=0;for(;j<101;j++){sum1=sum+j;chars[1000]={0};sprintf(s,"%d+%d=%d",sum,j,sum1);sleep(3);gdk_threads_enter();gtk_label_set_text(GTK_LABEL(label),s);gdk_threads_leave();sum=sum1;}}intmain(intargc,char*argv[]){intpid_1,pid_2,pid_3;if((pid_1=fork())==0){gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"child1progress");gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_NONE);gtk_container_set_border_width(GTK_CONTAINER(window),100);label=gtk_label_new(”nowlet'sbegin!");gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show_all(window);g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);/*線程的初始化*/if(!g_thread_supported())g_thread_init(NULL);gdk_threads_init();/*創(chuàng)建線程*/g_thread_create((GThreadFunc)havetime,NULL,FALSE,NULL);}elseif((pid_2=fork())==0){gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"child2progress");gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_NONE);gtk_container_set_border_width(GTK_CONTAINER(window),100);label=gtk_label_new(”nowlet'sbegin!");gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show_all(window);g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);/*線程的初始化*/if(!g_thread_supported())g_thread_init(NULL);gdk_threads_init();/* 創(chuàng)建線程*/g_thread_create((GThreadFunc)cpu_usage,NULL,FALSE,NULL);}一一"elseif((pid_3=fork())==0){gtk_init(&argc,&argv);/*窗口初始化*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"child3progress");gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_NONE);gtk_container_set_border_width(GTK_CONTAINER(window),100);/*標(biāo)簽*/label=gtk_label_new(”nowlet'sbegin!");gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show_all(window);g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);/*線程的■初始化*/if(!g_thread_supported())g_thread_init(NULL);gdk_threads_init();/*"創(chuàng)建線程*/g_thread_create((GThreadFunc)add,NULL,FALSE,NULL);}gdk_threads_enter();gtk_main();gdk_threads_leave();return0;}實驗二:sys.c:asmlinkageintsys_mysyscall(char*sourceFile,char*destFile){intsource=sys_open(sourceFile,O_RDONLY,0);intdest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600);charbuf[4096];mm_segment_tfs;fs=get_fs();設(shè)置為核的存訪問地址圍set_fs(get_ds());//設(shè)置為核的存訪問地址圍inti;if(source>0&&dest>0){do{i=sys_read(source,buf,4096);sys_write(dest,buf,i);}while(i);}sys_close(source);sys_close(dest);set_fs(fs);return10;}test.c:#include<sys/syscall.h>#include<unistd.h>intmain(){syscall(326,"text1.txt","text2.txt");return0;}實驗三:mydev.c:#include"linux/kernel.h"#include"linux/module.h"#include"linux/fs.h"#include"linux/init.h"#include"linux/types.h"#include"linux/errno.h"#include"linux/uaccess.h"#include"linux/kdev_t.h"#defineBUFFERSIZE1024staticintmy_open(structinode*inode,structfile*file);staticintmy_release(structinode*inode,structfile*file);staticssize_tmy_read(structfile*file,char__user*user,size_tt,loff_t*f);staticssize_tmy_write(structfile*file,constchar__user*user,size_tt,loff_t*f);staticcharmessage[BUFFER_SIZE]="U201414813";staticintdevice_num=0;//staticintcounter=0;//staticchar*devname="mydev";structfile_operationspstruct={.read=my_read,.write=my_write,.open=my_open,.release=my_release};"intinit_module(){intret;ret=register_chrdev(0,devname,&pstruct);if(ret<0){printk("registfailure\n");return-1;}else{printk("thedevicehasbeenregistered!\n");device_num=ret;printk("<1>thevirtualdevice'smajornumber%d.\n",device_num);printk("<1>Oryoucanseeitbyusing'n”);printk("<1> more/proc/devices \n");printk("<1>Totalktothedriver,createadevfilewith\n");printk("<1> 'mknod/dev/myDevicec%dO' \n",device_num);printk("<1>Use\"rmmode\"toremovethemodule\n");return0;}}voidcleanup_module(){unregister_chrdev(device_num,devname);printk("unregisteritsuccess\n”);}staticintmy_open(structinode*inode,structfile*file){printk("<1>maindevice:%d\n",MAJOR(inode->i_rdev));printk("<1>slavedevice:%d\n",MINOR(inode->i_rdev));printk("<1>%dtimestocallthedevice\n",++counter);try_module_get(THIS_MODULE);return0;}staticintmy_release(structinode*inode,structfile*file){printk("Devicereleased!'n");module_put(THIS_MODULE);return0;}staticssize_tmy_write(structfile*file,constchar__user*user,size_tt,loff_t*f){if(copy_from_user(message,user,sizeof(message))){return-EFAULT;}returnsizeof(message);}staticssize_tmy_read(structfile*file,char__user*user,size_tt,loff_t*f){if(copy_to_user(user,message,sizeof(message))){return-EFAULT;}returnsizeof(message);}test.c:#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#inelude<string.h>#include<stdio.h>#inelude<fcntl.h>#inelude<unistd.h>#defineMAX_SIZE1024intmain(void){intfd;charbuf[MAX_SIZE];charget[MAX_SIZE];chardevName[20],dir[50]="/dev/";system("ls/dev/");printf("Pleaseinputthedevice'snameyouwannatouse:”);gets(devName);strcat(dir,devName);fd=open(dir,O_RDWR|O_NONBLOCK);if(fd!=-1){read(fd,buf,sizeof(buf));printf("Thedevicewasinitedwithastring:%s\n",buf);/*測試寫*/printfC'PIeaseinputastring:\n");gets(get);write(fd,get,sizeof(get));/*測試讀*/read(fd,buf,sizeof(buf));system("dmesg");printf("\nThestringinthedevicenowis:%s\n",buf);close(fd);return0;}else{printf("Deviceopenfailed\n”);return-1;}}makefile:ifeq($(KERNELRELEASE),)KERNELDIR?=/Iib/modules/$(shelluname-r)/buildPWD:=$(shellpwd)modules:$(MAKE)-C$(KERNELDIR)M=$(PWD)modulesmodules_install:$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_installclean:rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions.PHONY:modulesmodules_installcleanelseobj-m:=mydev.oendif實驗四:#inelude<gtk/gtk.h>//gcc-oIab4Iab4.c'pkg-config--cflags--libsgtk+-2.0'char*txt_pid=NULL;GtkWidget*label1;char*get_cpu_name(char*buf1){FILE*fp;inti=0;char*buf_=buf1;fp=fopen("/proc/epuinfo",T');for(i=0;i<5;i++){fgets(buf_,256,fp);}"for(i=0;i<256;i++){if(buf_[i]==':')break;}i=i+2;buf_=buf_+i;buf_[31]='\0';fclose(fp);returnbuf_;}//獲取cpu名稱char*get_cpu_type(char*buf2){FILE*fp;inti=0;char*buf_=buf2;fp=fopen("/proc/epuinfo",T');for(i=0;i<2;i++){fgets(buf_,256,fp);}"for(i=0;i<256;i++){if(buf_[i]==':')break;}i=i+2;buf_=buf_+i;buf_[12]='\0';fclose(fp);returnbuf_;}"http://cpu類型char*get_cpu_f(char*buf3){FILE*fp;inti=0;char*buf_=buf3;fp=fopen("/proc/epuinfo","r");for(i=0;i<7;i++){fgets(buf_,256,fp);}//cpu主頻for(i=0;i<256;i++){if(buf_[i]==':')break;}i=i+2;buf_=buf_+i;buf_[8]='\0';fclose(fp);returnbuf_;}char*get_os_type(char*buf1){FILE*fp;char*buf_=buf1;fp=fopen("/etc/issue","r");fgets(buf_,13,fp);sprintf(buf_,"%s\0",buf_);fclose(fp);returnbuf_;}"char*get_os_version(char*buf2){FILE*fp;char*buf_=buf2;fp=fopen("/proc/version",“r");fgets(buf_,20,fp);sprintf(buf_,"%s\0",buf_);fclose(fp);returnbuf_;}voidcpu_usage(){FILE*fp;charcpu[5];charbuff[1OOO]={0};chars[1000]={0};longintuser,nice,sys,idle,iowait,irq,softirq;longints1,s2,idle1,idle2;floatusage;while(1){fp=fopen("/proc/stat",T');if(fp==NULL){perror("fopen”);exit(0);//從文件結(jié)構(gòu)體指針中讀取數(shù)據(jù)//從文件結(jié)構(gòu)體指針中讀取數(shù)據(jù)sscanf(buff,"%s%d%d%d%d%d%d%d",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);s1=user+nice+sys+idle+iowait+irq+softirq;idle1=idle;rewind(fp);

sleep(1);//memset(buff,0,sizeof(buff));//cpu[O]='\0';user=nice=sys=idle=iowait=irq=softirq=0;fgets(buff,sizeof(buff),fp);sscanf(buff,"%s%d%d%d%d%d%d%d",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);s2=user+nice+sys+idle+iowait+irq+softirq;idle2=idle;usage=(float)(s2-s1-(idle2-idle1))/(s2-s1)*100;sprintf(s,"CPU 利用率為%f%%",usage);gdk_threads_enter();gtk_label_set_text(GTK_LABEL(label1),s);gdk_threads_leave();fclose(fp);sleep(1);}}voidselect_row_callback(GtkWidget*event,gpointerdata){*clist,gintvoidselect_row_callback(GtkWidget*event,gpointerdata){*clist,gintrow,gint column,GdkEventButtongtk_clist_get_text(GTK_CLIST(clist),row,column,&txt_pid);printf("%s\n",txt_pid);voidrefresh(GtkWidget*clist){DIR*dir;structdirent*ptr;inti,j;FILE*fp;charbuf[1024];char_buffer[1024];char*buffer=_buffer;char*buffer2;charproc_pid[1024];charproc_name[1024];charproc_stat[1024];charproc_pri[1024];charproc_takeup[1024];chartext[5][1024];gchar*txt[5];gtk_clist_clear(GTK_CLIST(clist));名稱”);名稱”);狀態(tài)");gtk_clist_set_column_title(GTK_CLIST(clist),2,"

優(yōu)先級”);優(yōu)先級”);占用存");gtk_clist_set_column_title(GTK_CLIST(clist),4,"gtk_clist_set_column_width(GTK_CLIST(clist),0,50);gtk_clist_set_column_width(GTK_CLIST(clist),1,100);gtk_clist_set_column_width(GTK_CLIST(clist),2,50);gtk_clist_set_column_width(GTK_CLIST(clist),3,50);gtk_clist_set_column_width(GTK_CLIST(clist),4,55);gtk_clist_column_titles_show(GTK_CLIST(clist));dir=opendir("/proc");while(ptr=readdir(dir)){if((ptr->d_name)[0]>=48&&(ptr->d_name)[0]<=57){sprintf(buf,"/proc/%s/stat",ptr->d_name);fp=fopen(buf,"r");fgets(buffer,1024,fp);fclose(fp);for(i=0;i<1024;i++){if(buffer[i]=='')break;}buffer[i]='\0';strcpy(proc_pid,buffer);i+=2;buffer+=i;for(i=0;i<1024;i++){if(buffer[i]==')')break;}buffer[i]='\0';strcpy(proc_name,buffer);i+=2;buffer2=buffer+i;buffer2[1]='\0';strcpy(proc_stat,buffer2);for(i=0,j=0;i<1024&&j<15;i++){if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_pri,buffer2);for(j=0;i<1024&&j<4;i++){if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_takeup,buffer2);

sprintf(text[0],"%s",proc_pid);sprintf(text[1],"%s",proc_name);sprintf(text[2],"%s",proc_stat);sprintf(text[3],"%s",proc_pri);sprintf(text[4],"%s",proc_takeup);txt[O]=text[O];txt[1]=text[1];txt[2]=text[2];txt[3]=text[3];txt[4]=text[4];gtk_clist_append(GTK_CLIST(clist),txt);}}closedir(dir);}voidget_proc_info(GtkWidget*clist,int*p,int*q,int*r,int*s){DIR*dir;structdirent*ptr;inti,j;FILE*fp;charbuf[1024];char_buffer[1024];char*buffer=_buffer;char*buffer2;charproc_pid[1024];charproc_name[1024];charproc_stat[1024];charproc_pri[1024];charproc_takeup[1024];chartext[5][1024];gchar*txt[5];名稱”);狀態(tài)");名稱”);狀態(tài)");優(yōu)先級");占用存");while(ptr=readdir(dir)){if((ptr->d_name)[0]>=48&&(ptr->d_name)[0]<=57){(*P)++;sprintf(buf,"/proc/%s/stat",ptr->d_name);fp=fopen(buf,"r");fgets(buffer,1024,fp);fclose(fp);for(i=0;i<1024;i++){if(buffer[i]=='')break;}buffer[i]='\0';strcpy(proc_pid,buffer);i+=2;buffer+=i;for(i=0;i<1024;i++){if(buffer[i]==')')break;//id}buffer[i]='\0';strcpy(proc_name,buffer);i+=2;buffer2=buffer+i;buffer2[1]='\0';strcpy(proc_stat,buffer2);for(i=0,j=0;i<1024&&j<15;i++){if(buffer2[i]=='')j++;llname//station}buffer2+=i;for(i=0;i<1024;i++){if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_pri,buffer2);for(j=0;i<1024&&j<4;i++){if(buffer2[i]=='')j++;//priotity}buffer2+=i;for(i=0;i<1024;i++){if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_takeup,buffer2);//takeupmemeryif(!strcmp(proc_stat,"R"))(*q)++;if(!strcmp(proc_stat,"S"))(*r)++;if(!strcmp(proc_stat,"Z"))(*s)++;sprintf(text[0],"%s",proc_pid);sprintf(text[1],"%s",proc_name);sprintf(text[2],"%s",proc_stat);sprintf(text[3],"%s",proc_pri);sprintf(text[4],"%s",proc_takeup);txt[0]=text[0];txt[1]=text[1];txt[2]=text[2];txt[3]=text[3];txt[4]=text[4];gtk_clist_append(GTK_CLIST(clist),txt);}一一"}closedir(dir);}intmain(intargc,char*argv[]){charbufferl[10];charbuffer1[256];gtk_init(&argc,&argv);GtkWidget*window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_widget_set_size_request(window,600,400);gtk_window_set_title(GTK_WINDOW(window),"this'slab4~");//3. 創(chuàng)建筆記本控件GtkWidget*notebook=gtk_notebook_new();gtk_container_add(GTK_CONTAINER(window),notebook);gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook),GTK_POS_TOP);//gtk_widget_show(notebook);頁標(biāo)簽的位置// 第一個頁面GtkWidget*button4=gtk_label_new("Pageone");Iabel1=gtk_label_new("begin");//全局標(biāo)簽gtk_notebook_append_page(GTK_NOTEBOOK(notebook),Iabel1,button4);//子控件、、標(biāo)題名"一 "筆記本容器、gdk_threads_init();g_thread_create((GThreadFunc)cpu_usage,NULL,FALSE,NUL

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論