![計(jì)算機(jī)操作系統(tǒng)-課設(shè)(3)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/18/7a1ae49b-149d-4c8e-9bad-c4e4ec875a92/7a1ae49b-149d-4c8e-9bad-c4e4ec875a921.gif)
![計(jì)算機(jī)操作系統(tǒng)-課設(shè)(3)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/18/7a1ae49b-149d-4c8e-9bad-c4e4ec875a92/7a1ae49b-149d-4c8e-9bad-c4e4ec875a922.gif)
![計(jì)算機(jī)操作系統(tǒng)-課設(shè)(3)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/18/7a1ae49b-149d-4c8e-9bad-c4e4ec875a92/7a1ae49b-149d-4c8e-9bad-c4e4ec875a923.gif)
![計(jì)算機(jī)操作系統(tǒng)-課設(shè)(3)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/18/7a1ae49b-149d-4c8e-9bad-c4e4ec875a92/7a1ae49b-149d-4c8e-9bad-c4e4ec875a924.gif)
![計(jì)算機(jī)操作系統(tǒng)-課設(shè)(3)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/18/7a1ae49b-149d-4c8e-9bad-c4e4ec875a92/7a1ae49b-149d-4c8e-9bad-c4e4ec875a925.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課 程 設(shè) 計(jì) 報(bào) 告題目: 操作系統(tǒng)課設(shè)報(bào)告 專業(yè)班級(jí): 信息安全1302班 學(xué) 號(hào): 姓 名: 指導(dǎo)教師: 報(bào)告日期: 2016年3月18日 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目錄1.課程設(shè)計(jì)目的12.課程設(shè)計(jì)內(nèi)容13.實(shí)驗(yàn)內(nèi)容1 3.1.1.文件拷貝1 3.1.2.分窗口多進(jìn)程并發(fā)4 3.2.增加系統(tǒng)調(diào)用7 3.3.實(shí)現(xiàn)字符設(shè)備驅(qū)動(dòng)10 3.4.系統(tǒng)監(jiān)視器154.課設(shè)體會(huì)451. 課程設(shè)計(jì)目的掌握Linux操作系統(tǒng)的使用方法;了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。2. 課程設(shè)計(jì)內(nèi)容題目一:掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。1.
2、編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能(使用系統(tǒng)調(diào)用open/read/write.);2.編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫(kù)。 (gtk/Qt)題目二:掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯內(nèi)核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫一個(gè)應(yīng)用程序,使用新增加的系統(tǒng)調(diào)用。(1) 內(nèi)核編譯、生成,用新內(nèi)核啟動(dòng);(2) 新增系統(tǒng)調(diào)用實(shí)現(xiàn):文件拷貝或P、V操作。題目三:掌握增加設(shè)備驅(qū)動(dòng)程序的方法。通過模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,其功能可以簡(jiǎn)單。實(shí)現(xiàn)字符設(shè)備的驅(qū)動(dòng)題目四:使用GTK/QT實(shí)現(xiàn)系統(tǒng)監(jiān)控器了解/proc文件的特點(diǎn)和使用方法;監(jiān)控系統(tǒng)狀態(tài),
3、顯示系統(tǒng)中若干部件使用情況;用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài)。3. 實(shí)驗(yàn)內(nèi)容3.1.1文件拷貝功能說明:將測(cè)試用文件所在目錄下的名為“aaa.txt”文件的內(nèi)容拷貝至該文件夾下“bbb.txt”文件中,若該文件不存在,則創(chuàng)建該文件。設(shè)計(jì)思路:實(shí)現(xiàn)文件拷貝功能,主要用到的函數(shù)是open、write、read。由命令行參數(shù)獲取2個(gè)文件名,根據(jù)其文件名和路徑分別打開兩個(gè)文件,設(shè)置一個(gè)循環(huán),將源文件復(fù)制到目的文件,直到源文件指針到文件尾,最后關(guān)閉兩個(gè)文件。主要用到的頭文件:Unistd.h包含了許多l(xiāng)inux系統(tǒng)服務(wù)的函數(shù)原型,如read、writeFcntl.h定義了很多宏和open、fcntl函數(shù)原型S
4、tdio.h標(biāo)準(zhǔn)輸入輸出頭文件Sys/types.h包含適當(dāng)時(shí)應(yīng)使用的多個(gè)基本派生類型Sys/stat.h包含了獲取文件屬性的一些函數(shù)Error.h用于調(diào)試錯(cuò)誤代碼時(shí)所需要的一些error變量String.h包含了處理字符串的一些函數(shù)源程序:#include <sys/types.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <stdio.h>int main(int argc, char* a
5、rgv)char fblock1024;/設(shè)置一個(gè)緩沖區(qū)int fin, fout, nread;if(argc < 3)printf("argc number wrong!n");exit(0);printf("%sn", argv0);printf("%sn", argv1);printf("%sn", argv2);fin = open(argv1, O_RDONLY);/以只讀方式打開文件if(fin < 0)printf("file doesn't exist!")
6、;return 0;fout = open(argv2, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);while(nread = read(fin, fblock, sizeof(fblock) > 0)write(fout, fblock, nread);所用函數(shù):open()函數(shù)函數(shù)定義:int open( const char * pathname,int flags); 參數(shù)說明:參數(shù)pathname 指向欲打開的文件路徑字符串。下列是參數(shù)flags 所能使用的標(biāo)志位: O_RDONLY 以只讀方式打開文件 O_WRONLY 以只寫方式打開文件
7、O_RDWR 以可讀寫方式打開文件。 上述三種標(biāo)志位是互斥的,也就是不可同時(shí)使用,但可與下列的標(biāo)志位利用OR(|)運(yùn)算符組合。 O_CREAT 若欲打開的文件不存在則自動(dòng)建立該文件。 O_EXCL 如果O_CREAT 也被設(shè)置,此指令會(huì)去檢查文件是否存在。文件若不存在則建立該文件,否則將導(dǎo)致打開文件錯(cuò)誤。此外,若O_CREAT與O_EXCL同時(shí)設(shè)置,并且欲打開的文件為符號(hào)連接,則會(huì)打開文件失敗。 O_NOCTTY 如果欲打開的文件為終端機(jī)設(shè)備時(shí),則不會(huì)將該終端機(jī)當(dāng)成進(jìn)程控制終端機(jī)。 O_TRUNC 若文件存在并且以可寫的方式打開時(shí),此標(biāo)志位會(huì)令文件長(zhǎng)度清為0,而原來存于該文件的 資料也會(huì)消失。
8、 O_APPEND 當(dāng)讀寫文件時(shí)會(huì)從文件尾開始移動(dòng),也就是所寫入的數(shù)據(jù)會(huì)以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數(shù)據(jù)讀取或等待,都會(huì)立即返回進(jìn)程之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打開文件。 O_NOFOLLOW 如果參數(shù)pathname 所指的文件為一符號(hào)連接,則會(huì)令打開文件失敗。 O_DIRECTORY 如果參數(shù)pathname 所指的文件并非為一目錄,則會(huì)令打開文件失敗。 參數(shù)mode 組合此為L(zhǎng)inux2.2以后特有的標(biāo)志位,以避免一些系統(tǒng)安全問題。參數(shù)mode 則有下列數(shù)種組合,只有在建立新
9、文件時(shí)才會(huì)生效,此外真正建文件時(shí)的權(quán)限會(huì)受到umask值所影響,因此該文件權(quán)限應(yīng)該為(mode-umaks)。 S_IRWXU 00700 權(quán)限,代表該文件所有者具有可讀、可寫及可執(zhí)行的權(quán)限。 S_IRUSR 或S_IREAD, 00400權(quán)限,代表該文件所有者具有可讀取的權(quán)限。 S_IWUSR 或S_IWRITE,00200 權(quán)限,代表該文件所有者具有可寫入的權(quán)限。 S_IXUSR 或S_IEXEC, 00100 權(quán)限,代表該文件所有者具有可執(zhí)行的權(quán)限。 S_IRWXG 00070權(quán)限,代表該文件用戶組具有可讀、可寫及可執(zhí)行的權(quán)限。 S_IRGRP 00040 權(quán)限,代表該文件用戶組具有可讀
10、的權(quán)限。 S_IWGRP 00020權(quán)限,代表該文件用戶組具有可寫入的權(quán)限。 S_IXGRP 00010 權(quán)限,代表該文件用戶組具有可執(zhí)行的權(quán)限。 S_IRWXO 00007權(quán)限,代表其他用戶具有可讀、可寫及可執(zhí)行的權(quán)限。 S_IROTH 00004 權(quán)限,代表其他用戶具有可讀的權(quán)限 S_IWOTH 00002權(quán)限,代表其他用戶具有可寫入的權(quán)限。 S_IXOTH 00001 權(quán)限,代表其他用戶具有可執(zhí)行的權(quán)限。 返回值若所有欲核查的權(quán)限都通過了檢查則返回文件描述符,表示成功,只要有一個(gè)權(quán)限被禁止則返回-1read()函數(shù)函數(shù)定義:ssize_t read(int fd, void *buf,
11、size_t count); 參數(shù)說明:count是請(qǐng)求讀取的字節(jié)數(shù),讀上來的數(shù)據(jù)保存在緩沖區(qū)buf中,同時(shí)文件的當(dāng)前讀寫位置向后移。返回值:成功返回讀取的字節(jié)數(shù),出錯(cuò)返回-1并設(shè)置errno,如果在調(diào)read之前已到達(dá)文件末尾,則這次read返回0。write()函數(shù)函數(shù)定義:ssize_t write(int fd, void *buf, size_t count); 參數(shù)說明:write()會(huì)把參數(shù)buf所指內(nèi)存寫入count個(gè)字節(jié)到參數(shù)fd所指的文件內(nèi)。文件讀寫位置也會(huì)隨之移動(dòng)。返回值:如果順利write()會(huì)返回實(shí)際寫入的字節(jié)數(shù)。當(dāng)有錯(cuò)誤發(fā)生時(shí)則返回-1,錯(cuò)誤代碼存入error中。3
12、.1.2分窗口多進(jìn)程并發(fā)功能說明:用gtk實(shí)現(xiàn)分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果設(shè)計(jì)思路:安裝linux下的GTK+:在終端輸入sudo apt-get install gnome-core-devel,然后根據(jù)提示操作,就會(huì)安裝libgtk2.0-dev libglib2.0-dev等開發(fā)所需的相關(guān)庫(kù)文件。$sudo apt-get install build-essential$sudo apt-get install gnome-core-devel$sudo apt-get install pkg-config$sudo apt-get install libgtk2.0*編譯GTK
13、+代碼時(shí)需要包含的頭文件是gtk/gtk.h,此外還需在編譯測(cè)試文件時(shí)使用gcc test.c -o test pkg-config -cflags -libs gtk+-2.0編寫一個(gè)GTK+程序的基本步驟如下:1.初始化gtkgtk_init(&argc,&argv);/啟動(dòng)GTKgtk_window_new(GTK_WINDOW_TOPLEVEL);/創(chuàng)建窗口gtk_window_set_title(GTK_WINDOW(window),“標(biāo)題名”);/設(shè)置窗口標(biāo)題名gtk_widget_set_usize(window,200,200);/設(shè)置窗口大小gtk_widge
14、t_show(window);/顯示窗口2.建立控件gtk_table_new(gint rows,gint columns,gint homogeneous);/創(chuàng)建表格準(zhǔn)備封裝gtk_container_add(GTK_CONTAINER(window),table);/將表格結(jié)合到窗口里gtk_widget_show(table);/顯示該表格void gtk_table_attach_defaults(GtkTable*table,GtkWidget*widget,gintleft_attch,gintright_attch,ginttop_attach,gintbottom_attc
15、h);/要把物件放在box中3. 登記消息與消息處理函數(shù)4. 執(zhí)行消息循環(huán)函數(shù)gtk_main()源程序:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include<gtk/gtk.h>#include<string.h>GtkWidget *bar,*label,*table,*window;char buf20;GtkWidget *window;GtkWidget *text_view;GtkTextBuffer *buffer;GtkTextIter
16、*Iter;GtkWidget *box;int gtk(int argc,char *argv,char *title)GtkWidget *button;GtkTextIter start,end;gchar *text=title;gtk_init(&argc,&argv); /初始化window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /新建一個(gè)窗口gtk_window_set_title(GTK_WINDOW(window),"OS test"); /設(shè)置標(biāo)題gtk_window_set_default_size(
17、GTK_WINDOW(window), 230, 150);/設(shè)置大小gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);/將窗口設(shè)定在顯示器中央 g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);/連接上關(guān)閉函數(shù)gtk_main_quit;box=gtk_vbox_new(FALSE,0);/創(chuàng)建組裝框gtk_widget_show(box);text_view=gtk_text_view_n
18、ew();/創(chuàng)建文本框構(gòu)件gtk_container_add(GTK_CONTAINER(window),box);/將組裝框中加入窗口構(gòu)件gtk_box_pack_start(GTK_BOX(box),text_view,FALSE,FALSE,0);/將文本框放在組裝框上buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view);/*獲得文本框緩沖區(qū)*/gtk_container_add(GTK_CONTAINER(window),text_view);gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER
19、(buffer),&start,&end);/*獲得緩沖區(qū)開始和結(jié)束位置的Iter*/gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer),&start,text,strlen(text);/*插入文本到緩沖區(qū)*/gtk_widget_show(text_view);gtk_widget_show_all(window); gtk_main(); return 0;int main(int argc,char *argv)pid_t pid;pid=fork(); if(!pid) pid=fork(); if(pid>0)
20、 gtk(argc,argv,"Process2");/ Process2為 Process1的子進(jìn)程elsegtk(argc,argv,"Process3");/ Process3為 Process2的子進(jìn)程else if(pid>0) gtk(argc,argv,"Process1");if(pid<0) exit(0); return 0;主要函數(shù)函數(shù)定義:pid_t fork( void);函數(shù)說明:pid_t 是一個(gè)宏定義,其實(shí)質(zhì)是int 被定義在#include<sys/types.h>中。返回值:
21、 若成功調(diào)用一次則返回兩個(gè)值,子進(jìn)程返回0,父進(jìn)程返回子進(jìn)程ID;否則,出錯(cuò)返回-1。實(shí)驗(yàn)過程:1. 文件拷貝在系統(tǒng)主目錄文件夾下有“aaa.txt”文件,不存在“bbb.txt”文件,運(yùn)行filecopy.c 文件之后,“bbb.txt”文件被創(chuàng)建,內(nèi)容和“aaa.txt”文件內(nèi)容一樣。2. 多窗口進(jìn)程并發(fā)在終端運(yùn)行1-2.c程序,出現(xiàn)三個(gè)并發(fā)進(jìn)程的窗口,分別為“Process1”,“Process2”,“Process3”,其中,Process2為Process1的子進(jìn)程,Process3為Process2的子進(jìn)程。3.2 增加系統(tǒng)調(diào)用功能說明:通過編譯內(nèi)核方法,增加一個(gè)新的進(jìn)行文件拷貝的
22、系統(tǒng)調(diào)用。系統(tǒng)調(diào)用號(hào)為351,另編寫一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。實(shí)現(xiàn)的功能是:文件拷貝。實(shí)驗(yàn)過程:在kernel的下載網(wǎng)站上下載內(nèi)核linux3.2.78,解壓后拷貝到/usr/src目錄。對(duì)/usr/src/linux-3.2.78/kernel/sys.c進(jìn)行修改,添加實(shí)現(xiàn)文件拷貝功能的源代碼。添加的源代碼如下:/參數(shù)res代表拷貝源路徑,des為拷貝目的路徑asmlinkage int sys_sayhello(char *res,char *des)int in,out,i;char buf256;in =sys_open(res,O_RDONLY,0);if(in<0)
23、return -3;printk("Wrong!");out = sys_open(des,O_WRONLY|O_CREAT|O_TRUNC,0600);if(out<0)sys_close(in);return -2;mm_segment_t fs = get_fs();set_fs(get_ds();while(0<(i=sys_read(in,buf,sizeof(buf)sys_write(out,buf,i);sys_close(in);sys_close(out);set_fs(fs);return 0;修改/usr/src/linux-3.2.78
24、/arch/x86/include/asm/unistd_32.h,增加系統(tǒng)調(diào)用號(hào)。在系統(tǒng)調(diào)用號(hào)的末尾增加#define_NR_sayhello 349,即添加第349號(hào)系統(tǒng)調(diào)用,并將系統(tǒng)調(diào)用的總數(shù)改為350.修改系統(tǒng)調(diào)用表/usr/src/linux-3.2.78/arch/x86/kernel/syscall_table_32.S在最后一行添加:.long sys_sayhello在/etc/default/grub中,在GRUB_HIDDEN_TIMEOUT=0前面加#sudo make mrproper 凈化解壓后的源代碼sudo make menuconfig 對(duì)內(nèi)核選項(xiàng)進(jìn)行配置su
25、do make dep 建立模塊間的依賴信息sudo make clean 刪除配置時(shí)留下的一些不用的文件sudo make bzImage 編譯內(nèi)核,內(nèi)核較小時(shí)可以用make zImage sudo make modules 編譯內(nèi)核模塊 sudo make modules_install 安裝內(nèi)核模塊sudo make install 安裝內(nèi)核重啟用測(cè)試程序測(cè)試old.c#include <linux/unistd.h>#include <stdio.h>#include <stdlib.h>#include <asm/unistd.h>in
26、t main(int argc,char *argv) int b=syscall(349,argv1,argv2);printf("%dn",b); return 0;3.3實(shí)現(xiàn)字符設(shè)備驅(qū)動(dòng)功能說明:增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,將輸入的字符串輸出,并保存在緩沖區(qū)。設(shè)計(jì)思路:Linux核心是一種monolithic類型的內(nèi)核,核心的所有功能部件都被拆成獨(dú)立部分,這些部分通過嚴(yán)格的通訊機(jī)制進(jìn)行聯(lián)系。Linux內(nèi)核是一個(gè)整體結(jié)構(gòu),因此向內(nèi)核添加任何東西,或者刪除某些功能,都十分困難。為了解決這個(gè)問題引入了模塊機(jī)制,從而可以動(dòng)態(tài)地在內(nèi)核中添加或者刪除模塊。模塊一旦被插入內(nèi)核,就和內(nèi)
27、核其他部分一樣。源程序:#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"#define MAX_SIZ
28、E 1024static int my_open(struct inode *inode, struct file *file);static int my_release(struct inode *inode, struct file *file);static ssize_t my_read(struct file *file, char _user *user, size_t t, loff_t *f);static ssize_t my_write(struct file *file, const char _user *user, size_t t, loff_t *f);stat
29、ic char messageMAX_SIZE = ""static int device_num = 0;/設(shè)備號(hào)static int mutex = 0;/互斥用static char* devName = "myStrDevice"/設(shè)備名struct file_operations pStruct = open:my_open, release:my_release, read:my_read, write:my_write, ;/* 注冊(cè)模塊*/int init_module()int ret;ret = register_chrdev(0,
30、devName, &pStruct);if (ret < 0)printk("regist failure!n");return -1;elseprintk("the device has been registered!n");device_num = ret;printk("<1>the virtual device's major number %d.n", device_num);printk("<1>Or you can see it by usingn");
31、printk("<1>-more /proc/devices-n");printk("<1>To talk to the driver,create a dev file withn");printk("<1>-'mknod /dev/myDevice c %d 0'-n", device_num);printk("<1>Use "rmmode" to remove the modulen");return 0;/* 注銷模塊*/v
32、oid cleanup_module()unregister_chrdev(device_num, devName);printk(" - remove modules success -n");static int my_open(struct inode *inode, struct file *file) if(mutex) return -EBUSY; mutex = 1;/上鎖try_module_get(THIS_MODULE);return 0;/* 每次使用完后會(huì)release*/static int my_release(struct inode *ino
33、de, struct file *file)module_put(THIS_MODULE); mutex = 0;/開鎖 return 0;static ssize_t my_read(struct file *file, char _user *user, size_t t, loff_t *f)if(copy_to_user(user,message,sizeof(message)return -EFAULT;return sizeof(message);static ssize_t my_write(struct file *file, const char _user *user, s
34、ize_t t, loff_t *f)if(copy_from_user(message,user,sizeof(message)return -EFAULT;return sizeof(message);測(cè)試程序 #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <linux/rtc.h> #include <linux/ioctl.h> #include <stdio.h> #include <stdlib.h> i
35、nt main() char buff_in1024 = 0; /用戶態(tài)寫入緩沖區(qū) char buff_out1024 = 0; /用戶態(tài)讀出緩沖區(qū) int fd; int ret; int sel; fd = open("/dev/myDevice", O_RDWR); if(fd = -1) printf("打開設(shè)備文件失敗n"); exit(-1); printf("打開設(shè)備文件成功n"); loop1: printf("nn歡迎來到字符設(shè)備,請(qǐng)選擇你的操作:n1.寫操作 n2.讀操作 n3.退出n"); s
36、canf("%d", &sel); if(sel = 1) printf("請(qǐng)輸入你要寫入的內(nèi)容nn"); scanf("%s", buff_in); ret = write(fd, buff_in, 1024); if (ret = 0) perror("寫入失敗n"); exit(-1); printf("n寫入成功n"); goto loop1; else if(sel = 2) ret = read(fd, buff_out, 1024); if (ret = 0) perror
37、("read errorn"); exit(-1); printf("讀出字符成功!內(nèi)容如下:nn%sn", buff_out); goto loop1; else if(sel = 3) goto loop2; else printf("選擇有誤,請(qǐng)重新輸入!n"); goto loop1; loop2: close(fd); return 0;實(shí)驗(yàn)過程:1. #cd 3.1/進(jìn)入文件所在文件夾2. #make /生成驅(qū)動(dòng)模塊strdev.ko3. #insmod strdev.ko/裝載模塊4. #mknod /dev/devic
38、e c 251 0(用 cat /proc/devices找到系統(tǒng)分配的主設(shè)備號(hào))5.#gcc -o test test.c/測(cè)試程序,成功6. #.test7. rmmod strdev /卸載模塊8.#.test /再次測(cè)試,不成功,如圖10所示3.4 系統(tǒng)監(jiān)視器功能說明:監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況。設(shè)計(jì)過程及實(shí)現(xiàn):(1)/proc 文件特點(diǎn): Linux的proc文件系統(tǒng)是進(jìn)程文件系統(tǒng)和內(nèi)核文件系統(tǒng)的組成的復(fù)合體,是將內(nèi)核數(shù)據(jù)對(duì)象化為文件形式進(jìn)行存取的一種內(nèi)存文件系統(tǒng),是監(jiān)控內(nèi)核的一種用戶接口。它擁有一些特殊的文件(純文本),從中可以獲取系統(tǒng)狀態(tài)信息。 /proc/cpui
39、nfo保存CPU信息,包括名稱、型號(hào)、數(shù)目、主頻、Cache等; /proc/version保存操作系統(tǒng)信息,包括系統(tǒng)版本、內(nèi)核型號(hào)、GCC版本等; /proc/stat保存CPU活動(dòng)信息數(shù)據(jù),用來測(cè)算CPU使用率; /proc/meminfo保存內(nèi)存空間和交換空間實(shí)時(shí)大小,可用來計(jì)算內(nèi)存和交換分區(qū)使用率,MemTotal表示內(nèi)存空間總大小,MemFree表示內(nèi)存剩余空間大小,SwapTotal表示交換分區(qū)總大小,SwapFree表示交換分區(qū)剩余空間大小。據(jù)此可以算出內(nèi)存和交換分區(qū)的使用率。系統(tǒng)信息頁(yè)核心代碼結(jié)構(gòu)如下: vbox = gtk_vbox_new(FALSE,0);/新建容器 fr
40、ame = gtk_frame_new (bufferf1);/新建標(biāo)簽頁(yè) label = gtk_label_new (bufferf1);/新建文本框,其余兩個(gè)類似 gtk_container_add (GTK_CONTAINER (frame), label);/之后填入相應(yīng)的值gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);核心代碼結(jié)構(gòu)如下: sprintf(bufferl, "進(jìn)程信息"); hbox=gtk_hbox_new(FALSE, 5); scrolled_window =
41、gtk_scrolled_window_new (NULL, NULL);/滾屏 gtk_widget_set_size_request (scrolled_window, 300, 300); clist=gtk_clist_new(5);/5 lists get_proc_info(clist,&p,&q,&r,&s);/得到進(jìn)程信息 gtk_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL);/回調(diào)函數(shù),響應(yīng)行選
42、擇 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_star
43、t(GTK_BOX(vbox), frame, FALSE, FALSE, 10); button1 = gtk_button_new_with_label("結(jié)束進(jìn)程"); g_signal_connect (G_OBJECT (button1), "clicked",G_CALLBACK (kill_proc), "結(jié)束進(jìn)程");/殺死進(jìn)程回調(diào)函數(shù) gtk_box_pack_start(GTK_BOX(vbox), button1, FALSE, FALSE, 10); button2 = gtk_button_new_with_
44、label("刷新"); g_signal_connect_swapped (G_OBJECT (button2), "clicked",G_CALLBACK (refresh), clist); /按鈕回調(diào),刷新屏幕 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);核心代碼結(jié)構(gòu)如下: sprintf(
45、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
46、_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=
47、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);label = gtk_label_new (bufferl);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);核
48、心代碼結(jié)構(gòu)如下: capability = gtk_vbox_new(FALSE,0); /內(nèi)存資源 gtk_container_set_border_width(GTK_CONTAINER(capability),5); gtk_widget_set_size_request(capability,200,320); gtk_widget_show(capability); label = gtk_label_new(" 內(nèi)存資源 "); gtk_notebook_append_page(GTK_NOTEBOOK(notebook),capability,label);g
49、tk_notebook_set_current_page(GTK_NOTEBOOK(notebook),3);/*把此頁(yè)設(shè)為缺省顯示頁(yè)*/ cpu_hbox = gtk_hbox_new(FALSE,0);/cpu橫向box gtk_box_pack_start(GTK_BOX(capability),cpu_hbox,TRUE,TRUE,2); gtk_widget_show(cpu_hbox); mem_hbox = gtk_hbox_new(FALSE,0); /mem橫向box gtk_box_pack_start(GTK_BOX(capability),mem_hbox,TRUE,T
50、RUE,2); gtk_widget_show(mem_hbox); cpu_record = gtk_frame_new("cpu使用記錄"); /cpu使用記錄窗口 gtk_container_set_border_width(GTK_CONTAINER(cpu_record),5); gtk_widget_set_size_request(cpu_record,1000,130); gtk_widget_show(cpu_record); gtk_box_pack_start(GTK_BOX(cpu_hbox),cpu_record,TRUE,TRUE,2); cpu
51、_record_drawing_area = gtk_drawing_area_new (); gtk_widget_set_size_request (cpu_record_drawing_area, 50,50); g_signal_connect(G_OBJECT(cpu_record_drawing_area), "expose_event",G_CALLBACK(cpu_record_callback),NULL); gtk_container_add (GTK_CONTAINER(cpu_record), cpu_record_drawing_area); gt
52、k_widget_show (cpu_record_drawing_area); /內(nèi)存使用記錄窗口mem_record = gtk_frame_new("內(nèi)存使用記錄"); gtk_container_set_border_width(GTK_CONTAINER(mem_record),5); gtk_widget_set_size_request(mem_record,1000,130); gtk_widget_show(mem_record); gtk_widget_set_size_request (mem_record_drawing_area, 50,50);
53、g_signal_connect(G_OBJECT(mem_record_drawing_area), "expose_event",G_CALLBACK(mem_record_callback),NULL);/回調(diào) gtk_widget_show (mem_record_drawing_area);源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <sys/vfs.h>#include <sys/time.h>#include <dirent.h>char *txt_pid=NULL;char *txt_pid2=NULL;char* meminfo_read();/*內(nèi)存使用情況*/char* stat_read();/*cpu使用率*/char* procsum_read();/*進(jìn)程數(shù)*/gint mem_refresh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球離網(wǎng)房車行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球高脈沖能量皮秒激光器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 月齡嬰兒情緒情感與社會(huì)性親子活動(dòng)設(shè)計(jì)創(chuàng)造性撫觸游戲講解
- 2025【合同范本】建筑工程設(shè)計(jì)協(xié)議書
- 蔬菜配送合作合同范本
- 分期付款合同模板集錦
- 會(huì)簽單合同模板
- 全新對(duì)講機(jī)服務(wù)合同下載
- 勞務(wù)出資合伙協(xié)議合同
- 個(gè)人租車租賃合同范本
- 《建設(shè)工程監(jiān)理》課件
- 2019版新人教版高中英語(yǔ)必修+選擇性必修共7冊(cè)詞匯表匯總(帶音標(biāo))
- 初中八年級(jí)音樂-勞動(dòng)號(hào)子《軍民大生產(chǎn)》
- 中層領(lǐng)導(dǎo)的高績(jī)效管理
- 小小銀行家-兒童銀行知識(shí)、理財(cái)知識(shí)培訓(xùn)
- 機(jī)械基礎(chǔ)知識(shí)競(jìng)賽題庫(kù)附答案(100題)
- 閱讀理解特訓(xùn)卷-英語(yǔ)四年級(jí)上冊(cè)譯林版三起含答案
- 國(guó)庫(kù)集中支付培訓(xùn)班資料-國(guó)庫(kù)集中支付制度及業(yè)務(wù)操作教學(xué)課件
- 屋面及防水工程施工(第二版)PPT完整全套教學(xué)課件
- 2023年上海青浦區(qū)區(qū)管企業(yè)統(tǒng)一招考聘用筆試題庫(kù)含答案解析
- 2023年高一物理期末考試卷(人教版)
評(píng)論
0/150
提交評(píng)論