




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)用文檔實(shí)用文檔舉申彳*扶衣茅課程設(shè)計(jì)報(bào)課程名稱:操作系統(tǒng)原理院 系:專業(yè)班級(jí):學(xué) 號(hào):姓 名:指導(dǎo)教師:完成時(shí)間:計(jì)算機(jī)科學(xué)與技術(shù)CS140U2014142017年3月11日實(shí)用文檔實(shí)用文檔實(shí)用文檔實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)環(huán)境實(shí)驗(yàn)容.3.43.5實(shí)驗(yàn)一 實(shí)驗(yàn)二 實(shí)驗(yàn)三 實(shí)驗(yàn)四 實(shí)驗(yàn)五(選做)4設(shè)計(jì)與實(shí)現(xiàn)4.4實(shí)驗(yàn)一實(shí)驗(yàn)二實(shí)驗(yàn)三實(shí)驗(yàn)四5心得體會(huì)1114實(shí)驗(yàn)?zāi)康?掌握Linux操作系統(tǒng)的使用方法;-了解Linux系統(tǒng)核代碼結(jié)構(gòu);-掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法;實(shí)驗(yàn)環(huán)境本次課程設(shè)計(jì)采用的操作系統(tǒng)環(huán)境是windowslO、Ubuntu雙系統(tǒng),Ubuntu系統(tǒng)版本號(hào)為16.04,核版本號(hào)為linux444;前兩個(gè)實(shí)驗(yàn)在當(dāng)前Ubuntu環(huán)境下完成,后兩個(gè)實(shí)驗(yàn)在win10下虛擬機(jī)VirtualBox的Ubuntu15.10(核為linux4.2.0-42 )中完成。3實(shí)驗(yàn)容3.1實(shí)驗(yàn)一要求熟悉和理解Linux下的編程環(huán)境。(1)(QT/GTK實(shí)時(shí)監(jiān)測(cè)編寫(xiě)一個(gè)C程序,用fread、fwrite(1)(QT/GTK實(shí)時(shí)監(jiān)測(cè)編寫(xiě)一個(gè)C程序,使用基于文本的終端圖形編程庫(kù) (curses)或圖形界面,分窗口顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行(一個(gè)窗口實(shí)時(shí)顯示當(dāng)前時(shí)間,一個(gè)窗口CPU的利用率,一個(gè)窗口做1到100的累加求和,刷新周期分別為1秒,2秒和3秒)。3.2實(shí)驗(yàn)二要求掌握添加系統(tǒng)調(diào)用的方法,采用編譯核方法,添加一個(gè)新的系統(tǒng)調(diào)用,實(shí)現(xiàn)文件拷貝的功能,另外編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試新增加的系統(tǒng)調(diào)用。3.3實(shí)驗(yàn)三掌握增加設(shè)備驅(qū)動(dòng)程序的方法。采用模塊方法,添加一個(gè)新的字符設(shè)備驅(qū)動(dòng)程序,實(shí)現(xiàn)打開(kāi)/關(guān)閉,讀/寫(xiě)等基本操作。另外編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試新添加的驅(qū)動(dòng)程序。3.4實(shí)驗(yàn)四要求理解和分析/proc文件。(1)了解/proc文件的特點(diǎn)和使用方法;(2) 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)部件的使用狀態(tài);(3)用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài),包括CPU和存利用率、所有進(jìn)程信息等(可自己補(bǔ)充、添加其他功能);3.5實(shí)驗(yàn)五(選做)要求理解和掌握文件系統(tǒng)的設(shè)計(jì)方法(選做)。設(shè)計(jì)、實(shí)現(xiàn)一個(gè)模擬的文件系統(tǒng)。包括文件/目錄創(chuàng)建/刪除,目錄顯示等基本功能(可自行擴(kuò)充文件讀/寫(xiě)、用戶登錄、權(quán)限控制、讀寫(xiě)保護(hù)等其他功能)。4設(shè)計(jì)與實(shí)現(xiàn)4.1實(shí)驗(yàn)一4.1.1實(shí)驗(yàn)要求要求熟悉和理解Linux下的編程環(huán)境。4.1.2實(shí)驗(yàn)設(shè)計(jì)及調(diào)試(1)編寫(xiě)一個(gè)C程序,其容為實(shí)現(xiàn)文件拷貝的功能。這個(gè)實(shí)驗(yàn)的思路是聲明兩個(gè)文件指針*fp_read和*fp_write,前者用來(lái)打開(kāi)要讀的文件,后者打開(kāi)要寫(xiě)的文件,再創(chuàng)建一個(gè)1000個(gè)字節(jié)大小的緩沖區(qū)buff[],然后調(diào)用fread將容從文件1讀到buff里,再調(diào)用fwrite把容從buff寫(xiě)到文件2中。這個(gè)實(shí)驗(yàn)重點(diǎn)要掌握f(shuō)read和fwrite的使用方法,注意它們的參數(shù)和返回值。代碼見(jiàn)附件中源碼。實(shí)驗(yàn)結(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£看悴札礴駆営號(hào)與垂臥菠電干塔術(shù)i:ft淡一「))I0罕:1,曝*(?嵐網(wǎng)講ifi亟廉.墟孔冋滇Jfl三蟲(chóng)喝電列扎I辺=2咗更盯!習(xí)牴兩>?艮《蘿敬頑SSJH.t人日構(gòu)旳齊嘆珂?林時(shí)平好1.側(cè)陰丹,琵去三”.」.?+?「"世行咼一盂:拱此旳汪汕?不矽i”干萬(wàn)X能再;S若’恨列于青羽豈 事?tīng)?zhēng)示■(考前?丟左右?guī)岳ぃ? 甲氐進(jìn)訐齡后?S化.I4.1運(yùn)行之前圖運(yùn)行./Iab1_1text1.txttext2.txt后結(jié)果如下圖4.2:■.■■II■-i1r-■-■1-■11-1“Wf卜*閘可-r曲tJ■4■:ri■R:一 *開(kāi)mi〒 Pl'.^~i和《葉=?S諸,裁筑咆&毬口躺用la論as圖晦52迪C號(hào)鬥》?中6尹祁M:Sir-,as,政雷邨5?0旳畑1£3舌《肌呼強(qiáng)】農(nóng)信即3慕婕:《屯革戊用ffiijt-niis半-『臨耳謨示直帛:1一課本ta哉同濟(jì)五五堆,$吉%同:?^甲三戔,曲車浙丸版》…心陽(yáng)文廠:卉陽(yáng)5習(xí)捋1.3*(?a可:齊SS匪,敗代同濟(jì)電三師,H6辛-7.臨丈燈帝》CH??EVSin宰部分,0丸當(dāng)盤(pán)京?^對(duì)代S甘不Hl鮭代部H,李比樂(lè);城耳呂南)「【RfiasSS和!a宰st分,*人目跡旳戰(zhàn)件部分不妊:??代!》廿.先當(dāng)血--」.5?“2一”辺行鶴二遍丄邂召再詡?cè)?R勺注gfers通.不*1藝.干壯申Mi丈,--」一対“A”ia行弟二走,;皚后再第三《?此時(shí)注ssazs迓萬(wàn)平走即犧畐,找同乎畀明白i■■■4.^李永樂(lè)i老hLO天S右?guī)圆弧鲆?不斥平SffiiSS, 白)…華永樂(lè)左卓醛W-(吉燦汕丟左英苗r圖4.2運(yùn)行之后圖由上圖可見(jiàn)text1.txt成功拷貝至text2.txt(2)編寫(xiě)一個(gè)C程序,本次實(shí)驗(yàn)使用的是圖形界面GTK分窗口顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行(一個(gè)窗口實(shí)時(shí)顯示當(dāng)前時(shí)間,一個(gè)窗口實(shí)時(shí)監(jiān)測(cè)CPU的利用率,一個(gè)窗口做1到100的累加求和,刷新周期分別為1秒,2秒和3秒)。這個(gè)實(shí)驗(yàn)要用到gtk,首先要配置gtk,在終端中輸入:sudoapt-getinstalllibgtk2.0-dev涉及到3個(gè)進(jìn)程的并發(fā),所以要調(diào)用函數(shù)fork來(lái)創(chuàng)建3個(gè)進(jìn)程。我的思路是在這3個(gè)進(jìn)程中分別創(chuàng)建一個(gè)線程,去完成相應(yīng)的功能:顯示當(dāng)前時(shí)間,監(jiān)測(cè)CPU利用率,做累加求和。分別通過(guò)函數(shù)voidhavetimeO、voidcpu_usage()、voidadd()實(shí)現(xiàn),在main函數(shù)里,初步畫(huà)出3個(gè)進(jìn)程相應(yīng)的界面。具體的是調(diào)用gtk_window_new()函數(shù)創(chuàng)建一個(gè)窗口、gtk_window_set_title()設(shè)置窗口標(biāo)題、gtk_window_set_position 設(shè)置窗口在屏幕的位置、gtk_label_new()創(chuàng)建一個(gè)標(biāo)簽用來(lái)顯示文本、gtk_container_add ()把標(biāo)簽添加到窗口中、 gtk_widget_show_all()來(lái)展示需要展示的控件。例如創(chuàng)建第一個(gè)線程:g_thread_create((GThreadFunc)havetime,NULL,FALSE,NULL);通過(guò)在線程havetime()中實(shí)時(shí)更新標(biāo)簽label的容,然后在main()中創(chuàng)建的窗口中展示來(lái)完成所要求的功能。進(jìn)程2和3所要求的功能也是通過(guò)這種方法實(shí)現(xiàn)。注意用到gtk的編譯命令與以往不同,為:gcc-oIab1_2Iab1_2.c'pkg-config--cflags--libsgtk+-2.0'代碼見(jiàn)附件中的源碼,實(shí)驗(yàn)結(jié)果如下圖 4.3:childJ136+17=liichildJ136+17=lii圖4.3運(yùn)行結(jié)果圖小插曲:在調(diào)用sprintf(s,"CPU 利用率為%f%%,usage)想把利用率的“%拷進(jìn)緩沖區(qū)s后打印出來(lái)時(shí),一個(gè)百分號(hào)是不能夠打印出來(lái)的,要寫(xiě)兩個(gè) %如想要打印兩個(gè)%,則要寫(xiě)4個(gè)%以此類推。4.2實(shí)驗(yàn)二4.2.1實(shí)驗(yàn)要求要求掌握添加系統(tǒng)調(diào)用的方法,采用編譯核方法,添加一個(gè)新的系統(tǒng)調(diào)用,實(shí)現(xiàn)文件拷貝的功能,另外編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試新增加的系統(tǒng)調(diào)用。4.2.2實(shí)驗(yàn)設(shè)計(jì)及調(diào)試(1)下載一個(gè)核https://./pub/linux/kernel/v4.x/下載linux-4.4.4.tar.gz在/usr/src/ 目錄下解壓(用超級(jí)用戶權(quán)限),(2)編寫(xiě)新的系統(tǒng)調(diào)用程序用戶空間所使用的open、read、write、close函數(shù)此時(shí)對(duì)應(yīng)核函數(shù)為sys_open、sys_read、sys_write、sys_close。首先通過(guò)sys_open()打開(kāi)源文件和目標(biāo)文件,分別返回文件描述符source和dest,然后把當(dāng)前的用戶地址圍保存在 fs,再把當(dāng)前存訪問(wèn)地址圍設(shè)置為核的存地址訪問(wèn)圍,再通過(guò)sys_read()把源文件容寫(xiě)到buf,再用sys_write()把buf容寫(xiě)到dest,接著用sys_close()來(lái)關(guān)閉文件,最后再把存訪問(wèn)地址圍設(shè)置為用戶的。保存fs是避免使用的緩沖區(qū)超過(guò)了用戶空間的地址圍而報(bào)錯(cuò)。把自己寫(xiě)的這個(gè)系統(tǒng)調(diào)用程序添加至 /usr/src/linux-4.4.4/kernel目錄下的sys.c最后。(3)添加系統(tǒng)調(diào)用號(hào)在/usr/src/linux-444/arch/x86/entry/syscallssyscall_64.tbl 文件,添加一個(gè)自己的調(diào)用程序的系統(tǒng)調(diào)用號(hào),我的之前用到了325好,所以添加326號(hào),如下:目錄下修改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目錄下對(duì)核選項(xiàng)進(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后退出接下來(lái)就是漫長(zhǎng)的編譯核了(4個(gè)線程跑會(huì)快一些):sudomake-j4大概1個(gè)小時(shí)左右編譯完畢,再安裝核:安裝核模塊sudomakemodules_install//安裝核模塊sudomakeinstall//安裝核sudomakeinstall//安裝核安裝完畢后重啟,在Ubuntu高級(jí)選項(xiàng)中進(jìn)入新的核。(6)編寫(xiě)系統(tǒng)調(diào)用測(cè)試程序#include<sys/syscall.h>#include<unistd.h>intmain(){
syscall(326,"text1.txt","text2.txt");return0;}實(shí)驗(yàn)結(jié)果如下圖4.5:J*1J*113W■:fS中秤壬網(wǎng)啓}I,害+(鬲ST冋rSStifc"k=S代廁?濟(jì)話三曲屜豐窈尢盞:? V.肺宣燈:用研£習(xí)(F杠面訖和範(fàn)辛郃対,亦止翦譯阡和#iftS?廿肝] *;*代郃?T,莘承樂(lè)0畔1^?左3 Tt'77邃行拿一£E林咗再*三《,itt時(shí)連佇a遼:RS,不H的干萬(wàn)不能輙S,找冋爭(zhēng)弄境自;…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?,亞丹■「犧得沒(méi)詢*<后《呢(17」胃肝產(chǎn)皿瀾噪4特ZUtQ,國(guó)黃性2d扁”推石<石9就2酣7)...ni.加』間左ff宅卜開(kāi)眸fifg…大屮帯文址聞&ttins^a關(guān)聲乂?5!畢嗣的,(s((^a力,sj細(xì)再1衲號(hào)網(wǎng)?本人士小件文llll暹來(lái)丸聲了半』1胡5^=;,B5t4盒.乾誦審蚪不再幸一齊于曄a,亦出酣巨、ft習(xí)(15?聯(lián)£亡單詞r鶴蒂為』i后無(wú)氧占:用:札與tK曲說(shuō)老聽(tīng)imsa技巧「蠱^推當(dāng)):完曲刃知》廿i*,?■寫(xiě)女</?作£25*15分禪(悵文干A不詩(shī)筑豈啟后煙,3力弓柞五?=立戈?方一WWiHT練”仰帀籃抱文《=豐±主{4石7£*'*4> *壬得*:戊活■=¥1*合1 ?(=7a^SaiJi4>to_lii>jsJ-丹弓iAi?H- 1-'■!. 11. *總戍-rAn二匯.e*rl,1)1-5/圖4.5運(yùn)行之前的圖./Iab2后如下圖:FS專.任去一門(mén)》5??試:斬學(xué)一.電饑?泡桶農(nóng)自訥掙刑理論壩彌!#1廂眸韋<!*呂^章皆甘審干脈^:??-.雖詣.iW詒.FS專.任去一門(mén)》?ft<tB7,:業(yè)申*4牡大學(xué)出lifi酌晉書(shū).“以下節(jié)鍛.陽(yáng)供營(yíng)考“戡竽:[tn孑E示購(gòu)評(píng)) [1.?+苗)B何?1幫丑甌lift減產(chǎn)*三帆-兀再滾燈話was唐驀>iSeHRKWII部甘』iAaWEF旳tF世切好平薛)-理畑脅,2典樂(lè)^■■v?*"^.-a^isizjji(皓衍再需三ii-仙1#%工虧通-平曙rr,.干萬(wàn)不砥再?*,梅時(shí)3明0卜開(kāi)抬譽(yù)J?£.園岀昶1^1"遇帚屆后邇住“英5: _ _單詢業(yè)孌ife*te^”丸三下學(xué)WF學(xué).舛冶《單胡,到』舊怕,S△或3自-一11單間ISIS15業(yè)務(wù)荒15冊(cè)le悒P;□#同足英歯學(xué)習(xí)||整》戲那陽(yáng)』劑聞洙里考Jt章卻《*?酌那甘..戕1■人考養(yǎng)舛礙瀟:{?字S示融;T)].?*(鬣1?^濟(jì)》丑揭,?出杠同器哲三IS?《*石爻號(hào))-.2一W貢燈^<雷6習(xí)F&?>(HSRtt和典軍那罷』謁fS的級(jí)世3)甘平籽}- ifiASft£找代詛,顯)■■■)Tt'?-詛訐砰二1*護(hù)右S莫21?UMtfeOS-不3対,子萬(wàn)不麗SWS.扌炯T穴刑□: *.蘿匝樂(lè)亍HM.jJh代flflM,天吁舀開(kāi)制6JT.*4出霸魚(yú)謎盲翻胡也S遴:?jiǎn)伟。?1^削41童黑的.*=T*BIF學(xué).別7舊》,至工應(yīng)茂49走一連單間弗5竝另勘?尺退心)O*詞是黃說(shuō)字習(xí)寒重》的那時(shí)』fflS讀星專點(diǎn)卓丹8星雲(yún)蘆S鉗《*人=^菲肝更臥讀加訂"廠了.M得殳面芒ar, I區(qū)B因巧新曲硏讀更謝h伽了。W謁股心牯《方面旳龍化■看尹如(肝7口晳.9丟ttz£更,MS?石《用22?$>..,I1EB.J理ii,I星《開(kāi)如帯後【幷7L工惘.誓黃ttz.丄fi,博薦4石茫料衛(wèi)酊t,Kftjntf,可SF宇馬尹ift?<W*J,,龍*4謀交£壽&?島沖割軸R》HH孑[FJ.Sffi曬耳可S開(kāi)宅石幵曲*?£向充**,対g山建啖?啟,沖刊価859ttf軒陷,囁仿aB|閔fr幻按罕延廳亂將仿干P可遞厠衲村料SKHEZI,疋彌兩衲巧作逵每作,敢畢sit刪檀護(hù)可且氏禹vni5』扌科疽SHE齊”zkksiw?^柞s.V.*人大小杵文加近干只fflT半M呦廳吉,切a悴臺(tái). 旺.*:人大■■卜節(jié)文tiD更坯冃肖了半啣廳札齊哥件吃憊,藝出:SCa 英ffi證料不再*,在亍保咗透,K出弟壁..單詞,《呂昭;半; 鋰習(xí)rr宙*甲當(dāng):?jiǎn)涡鶬,?后耐;官傑- rnfix占-屈請(qǐng).號(hào)齊“營(yíng)jj 煥ST■鄭賓咼至ITti■英済奩料不再菲,S習(xí)靜嗣5^:¥占-FEW玉占-SS:±.G烹k tie?-9?f-1.W1sfiA圖4.6運(yùn)行之后的圖可見(jiàn)系統(tǒng)調(diào)用成功。4.3實(shí)驗(yàn)三4.3.1實(shí)驗(yàn)要求掌握增加設(shè)備驅(qū)動(dòng)程序的方法。采用模塊方法,添加一個(gè)新的字符設(shè)備驅(qū)動(dòng)程序,實(shí)現(xiàn)打開(kāi)/關(guān)閉,讀/寫(xiě)等基本操作。另外編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試新添加的驅(qū)動(dòng)程序。4.3.2實(shí)驗(yàn)設(shè)計(jì)及調(diào)試(1)添加設(shè)備驅(qū)動(dòng)原理:linux設(shè)備一般分為:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。驅(qū)動(dòng)程序運(yùn)行在核空間,應(yīng)用程序通常通過(guò)文件系統(tǒng)接口函數(shù)訪問(wèn)/dev目錄下的設(shè)備文件來(lái)訪問(wèn)驅(qū)動(dòng)程序。編寫(xiě)設(shè)備驅(qū)動(dòng)程序的主要工作就是編寫(xiě)file_operations 子函數(shù),這次實(shí)驗(yàn)主要完成的就是file-operations 數(shù)據(jù)結(jié)構(gòu)中個(gè)模塊,file_operations的.open\.release\.read\.wnte4結(jié)構(gòu)的每個(gè)域都對(duì)應(yīng)一個(gè)系統(tǒng)調(diào)用。用戶進(jìn)程利用系統(tǒng)調(diào)用在對(duì)設(shè)備文件進(jìn)行諸如read/write等操作時(shí),系統(tǒng)調(diào)用通過(guò)設(shè)備文件的主設(shè)備號(hào)找到相應(yīng)的設(shè)備驅(qū)動(dòng)程序,然后讀取該數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。編寫(xiě)Makefile文件Makefile文件用于編譯設(shè)備驅(qū)動(dòng)程序,其容如下: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編寫(xiě)設(shè)備功能函數(shù)編寫(xiě)設(shè)備驅(qū)動(dòng)程序的主要工作就是編寫(xiě)子功能函數(shù)。open()函數(shù)用來(lái)打開(kāi)一個(gè)設(shè)備,在該函數(shù)中可以對(duì)設(shè)備進(jìn)行初始化。如果這個(gè)函數(shù)被賦值NULL那么設(shè)備打開(kāi)永遠(yuǎn)成功,并不會(huì)對(duì)設(shè)備產(chǎn)生影響。release()函數(shù)用來(lái)釋放open()函數(shù)中申請(qǐng)的資源,并在文件引用計(jì)數(shù)為0時(shí),被系統(tǒng)調(diào)用。其對(duì)應(yīng)應(yīng)用程序的close()方法,但并不是每一次調(diào)用close()方法,都會(huì)觸發(fā)release()函數(shù),只有在打開(kāi)的所有設(shè)備文件都釋放后,該函數(shù)才會(huì)被調(diào)用?!猺ead()函數(shù)用來(lái)從設(shè)備中獲取數(shù)據(jù),成功時(shí)返回讀取的字節(jié)數(shù),失敗時(shí)返回一個(gè)負(fù)的錯(cuò)誤碼。write()函數(shù)用來(lái)寫(xiě)數(shù)據(jù)到設(shè)備中。成功時(shí)該函數(shù)返回寫(xiě)入的字節(jié)數(shù)。詳細(xì)實(shí)現(xiàn)見(jiàn)附件中源碼。(4)設(shè)備驅(qū)動(dòng)程序安裝①make調(diào)用Makefile編譯設(shè)備驅(qū)動(dòng)程序圖4.7make圖編譯成功,生成mydev.ko文件makeH=yhone/tanGLl*jel/桌同/Lmbr^ocuL^shemde「s-斗.2.e-42-generic'②sudoinsmodmydev.ko掛載模塊,再查看設(shè)備的主設(shè)備號(hào):cat/proc/devices226248249250251dmmydevbsgwatchdogrtc圖4.8主設(shè)備號(hào)的圖可見(jiàn)系統(tǒng)為mydev生成的主設(shè)備號(hào)為248③sudo/dev/mydevc2480mydev是設(shè)備文件的名字,“c”是指創(chuàng)建的是字符設(shè)備文件,0是從設(shè)備些 248是主設(shè)備號(hào),k
bscbuscdromcharne3S£圖4.9生成設(shè)備文件圖可見(jiàn)生成了正確的設(shè)備文件mydev(5)測(cè)試驅(qū)動(dòng)程序測(cè)試程序?qū)崿F(xiàn)的是先從設(shè)備中讀出里面初始的字符串 U201414813再把一個(gè)字符串寫(xiě)進(jìn)去,然后再讀出來(lái),測(cè)試程序詳見(jiàn)附件源碼,測(cè)試實(shí)驗(yàn)結(jié)果如下圖:先運(yùn)行命令執(zhí)行程序:sudo./test串寫(xiě)進(jìn)去,然后再讀出來(lái),測(cè)試程序詳見(jiàn)附件源碼,測(cè)試實(shí)驗(yàn)結(jié)果如下圖:先運(yùn)行命令執(zhí)行程序:sudo./testdevice'srtaneyouwannatousemydevPleeseYnpu士thedevice'srtaneyouwannatousemydevrhedevicewasInlte-dwithastring:U291414813Pledseinputastring:1likeOSlabrhestringInthedevicenowIsitlikeoslabngllwel=VtrTuaiBox:桌面/lab驚|圖4.10結(jié)果圖可見(jiàn)打開(kāi)、讀、寫(xiě)均正確。最后執(zhí)行sudormmodmydev來(lái)刪除模塊sudorm/dev/mydev來(lái)刪除設(shè)備文件4.4實(shí)驗(yàn)四要求理解和分析/proc文件。4.4.1實(shí)驗(yàn)要求了解/proc文件的特點(diǎn)和使用方法;監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)部件的使用狀態(tài);用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài),包括CPU和存利用率、所有進(jìn)程信息等(可自己補(bǔ)充、添加其他功能)。4.4.2實(shí)驗(yàn)設(shè)計(jì)及調(diào)試這個(gè)實(shí)驗(yàn)主要是對(duì)/proc文件的理解和對(duì)gtk的熟練運(yùn)用。我用gtk里的筆記本構(gòu)件畫(huà)了3個(gè)頁(yè)面,分別為Pageone、pagetwo、pagethree。pageone:顯示CPU利用率計(jì)算和顯示CPUft接用到的實(shí)驗(yàn)一第二個(gè)部分的顯示CPU利用率部分,不同的是這兒用到了筆記本控件,要把“Pageone”作為一個(gè)button加到notebook上,還要把算出來(lái)的CPU利用率作為一個(gè)標(biāo)簽容加到notebook上,即:GtkWidget*button4=gtk_label_new(”P(pán)ageone");Iabel1=gtk_label_new("begin");// 全局標(biāo)簽gtk_notebook_append_page(GTK_NOTEBOOK(notebook),Iabel1,button4);// 筆記本容器、子控件、標(biāo)題名然后創(chuàng)建一個(gè)線程去計(jì)算CPU利用率,然后實(shí)時(shí)更新顯示出來(lái)。Pagetwo:顯示所有進(jìn)程信息
用gtk來(lái)畫(huà)這個(gè)界面的邏輯是:最大的邏輯控件是筆記本notebook,把一個(gè)hbox添加到notebook里,再把顯示所有進(jìn)程信息的表 clist 添加到一個(gè)滾動(dòng)窗口scrolled_window里,再把這個(gè)scrolled_window添加到hbox左邊部分;hbox右邊部分包括一個(gè)vbox,這個(gè)vbox上面是一個(gè)frame來(lái)顯示進(jìn)程大致情況,下面是一個(gè)button用來(lái)刷新進(jìn)程。如下圖4.11:notebookhboxscrolled_windowvboxscrolled_windowvboxclistframeclistbutton圖4.11構(gòu)件分布結(jié)構(gòu)圖clist 中所有進(jìn)程信息是通過(guò) voidget_proc_info(GtkWidget *clist,int*p,int*q,int*r,int*s) 函數(shù)讀出來(lái)的,具體就是遍歷/proc文件夾下所有的數(shù)字文件夾,這些數(shù)字文件夾的stat中存放的就是所有進(jìn)程的部分信息,包括:PID、名稱、狀態(tài)、優(yōu)先級(jí)、占用存,直接遍歷讀出來(lái)后加到 clist中顯示出來(lái)。同樣,frame中的總進(jìn)程數(shù)、運(yùn)行進(jìn)程數(shù)、睡眠進(jìn)程數(shù)、僵尸進(jìn)程數(shù)也都是根據(jù)get_proc_info ()出來(lái),通過(guò)voidrefresh(GtkWidget*clist)GtkWidget*button2=gtk_button_new_with_label("g_signal_connect_swapped (G_OBJECT(button2),clist);當(dāng)button2出來(lái),通過(guò)voidrefresh(GtkWidget*clist)GtkWidget*button2=gtk_button_new_with_label("g_signal_connect_swapped (G_OBJECT(button2),clist);當(dāng)button2上發(fā)生click事件時(shí)就調(diào)用refresh刷新”);完成刷新。"clicked",G_CALLBACK(refresh),完成刷新。pagethree:顯示一些基本的CPU言息這頁(yè)就是簡(jiǎn)單的創(chuàng)建兩個(gè)frame1和frame2來(lái)顯示CPU部分信息和操作系統(tǒng)的部分信息。frame1中:CPI名稱通過(guò)char*get_cpu_name(char*buf1)函數(shù)獲得,CPU類型通過(guò)char*get_cpu_type(char*buf2)函數(shù)獲得,CPU主頻通過(guò)char*get_cpu_f(char*bu⑶函數(shù)獲得,這3個(gè)信息都是從/proc/cpuinfo中讀出來(lái)的,其中涉及到一些簡(jiǎn)單的字符串的判斷等操作,在此不加贅述;
frame2中:操作系統(tǒng)名稱是通過(guò)char*get_os_type(char*buf1)函數(shù)獲得的,操作系統(tǒng)版本是通過(guò)char*get_os_version(char*buf2)函數(shù)獲得的,它們都返回一個(gè)緩沖區(qū)指針,用以在主函數(shù)main()中顯示。3個(gè)頁(yè)面的詳細(xì)代碼見(jiàn)附件中源碼。編譯:gcc-oIab4Iab4.c'pkg-config--cflags--libsgtk+-2.0'執(zhí)行:./Iab4實(shí)驗(yàn)結(jié)果如下圖4.12、4.13、4.14:this^'sIab4?問(wèn)匸5已PagetwoPagethreeCPU利用率為1.020408%圖4.12第一個(gè)頁(yè)面圖this'sIab4onePag時(shí)twoPagethreePID名稱狀態(tài)優(yōu)先級(jí)占用內(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第二個(gè)頁(yè)面圖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第三個(gè)頁(yè)面圖圖4.14第三個(gè)頁(yè)面圖Copyright@20l7tangliwei心得體會(huì)本次課程設(shè)計(jì),第一個(gè)題目第一問(wèn)很簡(jiǎn)單,因?yàn)橹霸趯?shí)驗(yàn)中寫(xiě)過(guò)文件拷貝的程本次課程設(shè)計(jì),第一個(gè)題目第一問(wèn)很簡(jiǎn)單,因?yàn)橹霸趯?shí)驗(yàn)中寫(xiě)過(guò)文件拷貝的程序,所以很快就順利實(shí)現(xiàn)了,要注意fopen序,所以很快就順利實(shí)現(xiàn)了,要注意fopen、剛開(kāi)始不知怎么做,主要是因?yàn)橹皼](méi)接觸過(guò)fread、fwrite幾個(gè)函數(shù)的用法,第二問(wèn)gtk這種畫(huà)界面的環(huán)境,在網(wǎng)上查閱相關(guān)資料后發(fā)現(xiàn)套路都是一樣的,個(gè)人覺(jué)得把握住gtk中控件的概念,實(shí)現(xiàn)簡(jiǎn)單的界面都還是比較簡(jiǎn)單的,除了gtk,在CPU利用率的計(jì)算上還卡了一段時(shí)間,主要是沒(méi)弄清到底應(yīng)該怎么計(jì)算,查了大量資料后找到一種比較簡(jiǎn)單的計(jì)算方法去實(shí)現(xiàn),結(jié)果也很準(zhǔn)確;第二題和第三題是同一類型,都是需要對(duì)核、系統(tǒng)調(diào)用、設(shè)備驅(qū)動(dòng)文件有很
好的理解才能很快做出來(lái),自己還掌握得不是很好,所以也花了不少的時(shí)間去查資料、實(shí)現(xiàn)要求的功能,但現(xiàn)在回過(guò)頭來(lái)看收獲很大,對(duì)課上所學(xué)的部分容有了更加深刻的理解,對(duì)linux系統(tǒng)調(diào)用和設(shè)備文件有了更深的認(rèn)識(shí);第四題確實(shí)是花的時(shí)間最多的,因?yàn)椴粌H涉及到復(fù)雜的gtk運(yùn)用,還包括對(duì)/proc文件的理解,這兩方面都是查了大量資料后才一點(diǎn)點(diǎn)完成的,時(shí)間花了,確實(shí)也有了成效,看到自己畫(huà)的界面和讀出的進(jìn)程、CPU信息,成就感瞬間爆棚,但這還遠(yuǎn)遠(yuǎn)不夠,相信以后學(xué)習(xí)工作中還會(huì)遇到更加困難的類似的問(wèn)題,這次課設(shè)只是打下了個(gè)小小的基礎(chǔ),任重道遠(yuǎn)!總之,這次課設(shè)受益匪淺。實(shí)用文檔實(shí)用文檔實(shí)用文檔6附錄(源碼)實(shí)驗(yàn)一:第一題:#include<stdio.h>#definebuffersize1000intmain(intargc,char*argv[]){if(argc!=3){//輸入3個(gè)參數(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í)際讀到字符數(shù)GtkWidget*window;GtkWidget*label;voidhavetime(){inti;for(;;i++){time_ttimer=time(NULL);chars[1000]={0};格式化字符串寫(xiě)入s格式化字符串寫(xiě)入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","門(mén);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;}實(shí)驗(yàn)二: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è)置為核的存訪問(wèn)地址圍set_fs(get_ds());//設(shè)置為核的存訪問(wèn)地址圍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;}實(shí)驗(yàn)三: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);/*測(cè)試寫(xiě)*/printfC'PIeaseinputastring:\n");gets(get);write(fd,get,sizeof(get));/*測(cè)試讀*/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實(shí)驗(yàn)四:#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)先級(jí)”);優(yōu)先級(jí)”);占用存");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)先級(jí)");占用存");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);頁(yè)標(biāo)簽的位置// 第一個(gè)頁(yè)面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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026屆徐州市重點(diǎn)中學(xué)中考語(yǔ)文五模試卷含解析
- 家庭急救培訓(xùn)核心技能與實(shí)施指南
- 急救常識(shí)及急救技能培訓(xùn)
- 鄉(xiāng)村民族工作匯報(bào)
- 年產(chǎn)xx萬(wàn)臺(tái)掃雪機(jī)項(xiàng)目可研報(bào)告
- 2025版彩鋼瓦房門(mén)窗更換及維護(hù)保養(yǎng)服務(wù)合同
- 2025年度綠色建筑施工現(xiàn)場(chǎng)職業(yè)健康安全綜合管理服務(wù)協(xié)議書(shū)
- 2025版工地水電設(shè)施維護(hù)與應(yīng)急響應(yīng)服務(wù)合同
- 2025版離婚協(xié)議中財(cái)產(chǎn)分割及子女撫養(yǎng)及贍養(yǎng)費(fèi)支付及共同債務(wù)處理及財(cái)產(chǎn)增值參考模板
- 二零二五年度電纜溝施工及施工環(huán)境保護(hù)合同
- 太極教程短視頻行業(yè)跨境出海項(xiàng)目商業(yè)計(jì)劃書(shū)
- bot模式項(xiàng)目協(xié)議書(shū)
- 2025年日本數(shù)學(xué)奧林匹克(JMO)模擬試卷:代數(shù)方程與幾何變換解題策略與實(shí)戰(zhàn)演練
- 2025年投資銀行在智能建筑產(chǎn)業(yè)融資中的角色演變與業(yè)務(wù)創(chuàng)新趨勢(shì)
- 機(jī)房火災(zāi)應(yīng)急預(yù)案演練(3篇)
- GB/T 17642-2025土工合成材料非織造布復(fù)合土工膜
- 醫(yī)療信息化的數(shù)字化轉(zhuǎn)型項(xiàng)目評(píng)估指標(biāo)體系
- 2025-2030中國(guó)納米銅粉行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 精神衛(wèi)生法知識(shí)講座課件
- 部隊(duì)花樣主食培訓(xùn)課件
- 2025-2030中國(guó)裝飾畫(huà)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
評(píng)論
0/150
提交評(píng)論