


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計報告課程名稱:計算機(jī)操作系統(tǒng)專業(yè)班級:_學(xué) 號:姓 名:指導(dǎo)教師:報告日期:計算機(jī)科學(xué)與技術(shù)學(xué)院1 實(shí)驗(yàn)?zāi)康恼莆?Linux 操作系統(tǒng)的使用方法;了解 Linux 系統(tǒng)內(nèi)核代碼結(jié)構(gòu); 掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法;2 實(shí)驗(yàn)環(huán)境本次課程設(shè)計采用的操作系統(tǒng)環(huán)境是 windows8、Ubuntu雙系統(tǒng),Ubuntu系統(tǒng)版本號為,內(nèi)核版本號為 linux ;采用的編程環(huán)境為 CodeBlocks IDE 和 QtCreator 。3 實(shí)驗(yàn)內(nèi)容3.1 實(shí)驗(yàn)一掌握 Linux 操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在 Linux 下 的編程環(huán)境。(1) 編寫一個C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝
2、的功能。(2) 編寫一個C程序,其內(nèi)容為分窗口同時顯示三個并發(fā)進(jìn)程的運(yùn)行結(jié)果。要 求用到 Linux 下的圖形庫( GTK/Qt)。3.2 實(shí)驗(yàn)二掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯內(nèi)核方法,增加一個新的系統(tǒng)調(diào)用,另編 寫一個應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。實(shí)現(xiàn)的功能是:文件拷貝。3.3 實(shí)驗(yàn)三掌握增加設(shè)備驅(qū)動程序的方法。通過模塊方法,增加一個新的設(shè)備驅(qū)動程序, 其功能可以簡單。(實(shí)現(xiàn)字符設(shè)備的驅(qū)動)3.4 實(shí)驗(yàn)四(選做)了解和掌握 /proc 文件系統(tǒng)的特點(diǎn)和使用方法(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);3
3、.5 實(shí)驗(yàn)五(選做)設(shè)計并實(shí)現(xiàn)一個模擬的文件系統(tǒng)。多用戶的多級目錄的文件系統(tǒng)設(shè)計。多用戶、多級目錄、 login (用戶登錄)、 系統(tǒng)初始化(建文件卷,提供登錄模塊) 、文件的創(chuàng)建、文件的打開、文件的讀寫、 文件關(guān)閉、刪除文件、創(chuàng)建目錄(建立子目錄) 、改變當(dāng)前目錄、列出文件目錄、退 出。4 設(shè)計與實(shí)現(xiàn)4.1 實(shí)驗(yàn)一4.1.1 實(shí)驗(yàn)要求掌握 Linux 操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在 Linux 下 的編程環(huán)境。4.1.2 具體實(shí)現(xiàn)本實(shí)驗(yàn)內(nèi)容是用 CodeBlocks IDE 實(shí)現(xiàn)的,該軟件整合了函數(shù)庫和編譯器,因此 使用起來非常方便。(1)編寫一個 C 程序,其內(nèi)容為實(shí)現(xiàn)
4、文件拷貝的功能。在 windows 操作系統(tǒng)上實(shí)現(xiàn)的文件拷貝功能一般使用 fopen 、fread 、fwrite 三 個來自標(biāo)準(zhǔn) C 函數(shù)庫的函數(shù)執(zhí)行對文件的打開、讀、寫操作,而本次實(shí)驗(yàn)要求使用 Linux 系統(tǒng)的系統(tǒng)調(diào)用 open、read 、write 實(shí)現(xiàn)上述三個操作。用到的主要頭文件如下:標(biāo)準(zhǔn)輸入輸出頭文件 字符串處理相關(guān)頭文件 Linux 系統(tǒng)調(diào)用頭文件,比如 read 、write 包含 open 系統(tǒng)調(diào)用包含一些調(diào)試錯誤時用到的變量具體實(shí)現(xiàn)思路: 打開兩個文件(分別是源文件和目標(biāo)文件,可以是任意字符流形式存儲的文件, 包括文本文件、照片等),調(diào)用read函數(shù)讀取源文件的內(nèi)容,將
5、read的返回值作為 while 循環(huán)的判斷條件, 當(dāng)返回值大于 0(即還未讀取完畢源文件中的內(nèi)容) 時,調(diào) 用 write 執(zhí)行向目標(biāo)文件寫的操作,否則跳出循環(huán),表示源文件已經(jīng)被拷貝到目標(biāo) 文件,然后調(diào)用 close 關(guān)閉源文件和目標(biāo)文件。代碼編寫完成后,在 CodeBlocks 上編譯運(yùn)行即可。程序運(yùn)行之前,桌面上只有 “教程.docx ”,運(yùn)行之后,桌面上新建了“教程副本.docx ”,并且“教程.docx ” 中的內(nèi)容被復(fù)制到了“教程副本.docx ”,程序運(yùn)行結(jié)果如下所示:詳細(xì)代碼見。(2)編寫一個C程序,其內(nèi)容為分窗口同時顯示三個并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到 Linux 下的圖形庫
6、( GTK/Qt )。本次實(shí)驗(yàn)使用的圖形庫是跨平臺的開發(fā)工具 Qt。首先下載Qt的安裝包并安裝。 Qt安裝完之后,先新建一個 Qt控制臺應(yīng)用MAIN作為主進(jìn)程,用于調(diào)用三個并發(fā) 的子進(jìn)程。在主進(jìn)程的 main 函數(shù)中,使用 fork 創(chuàng)建三個子進(jìn)程,若進(jìn)程創(chuàng)建成功(即fork函數(shù)返回值等于0),則使用execv函數(shù)進(jìn)入對應(yīng)的子進(jìn)程(get、copy、put)。 主進(jìn)程程序編寫完成后,再新建三個 Qt Widgets Application ,分別作為三個子進(jìn)程 get、copy、put (所實(shí)現(xiàn)的功能并不是拷貝)。由于三個子進(jìn)程窗口顯示的內(nèi)容形式 一模一樣,所以以子進(jìn)程get為例。get進(jìn)程的
7、窗口顯示了一下四個內(nèi)容:當(dāng)前時間、 子進(jìn)程名稱、子進(jìn)程的pid和父進(jìn)程MAIN的pid。用Qt的對象QDateTime獲取系 統(tǒng)當(dāng)前時間, 然后將時間轉(zhuǎn)換成一個字符串寫在一個 QLabel 類的實(shí)例中, 然后將該 實(shí)例添加至窗口;直接把當(dāng)前進(jìn)程名稱寫在一個標(biāo)簽上然后添加至窗口; 使用 getpid 和 getppid 函數(shù)分別獲取當(dāng)前進(jìn)程號和父進(jìn)程號,然后調(diào)用 sprintf 把進(jìn)程號轉(zhuǎn)換成 字符串類型之后寫在標(biāo)簽上并添加至窗口即可。主進(jìn)程和三個子進(jìn)程的程序全部編寫完后,直接在 Qt 上編譯運(yùn)行。程序運(yùn)行結(jié) 果如下所示:詳細(xì)代碼見。4.1.3 源代碼(1) 文件拷貝源代碼#include &l
8、t;>#include <>#include <>#include <>#include <>#include <sys/>#include <> #define SIZE 10 ocx" char *goalFile="/home/ilbear/ 桌面 /教程副本 .docx" int main(int argc, const char *argv)int src, goal;int read_len;char buffSIZE; src=open(srcFile,O_RDONL Y)
9、; if(src<0)printf("Fail to open %sn.",srcFile); exit(1); goal=open(goalFile,O_WRONL Y|O_CREA T,0666); if(goal<0)printf("Fail to open %sn.",goalFile); exit(1); while(read_len=read(src,buff,SIZE)>0) write(goal,buff,read_len); close(src); close(goal); return 0;(2) 三個并發(fā)進(jìn)程 #主
10、進(jìn)程 MAIN#include <QCoreApplication>#include <sys/>#include <sys/>#include <sys/>#include <>#include <>int main(int argc, char *argv)QCoreApplication a(argc, argv); pid_t p1,p2,p3;if(p1=fork()=0) execv("/home/ilbear/ 桌面/build-get-Desktop_Qt_5_4_1_GCC_64bit-Debu
11、g/get",NULL); else if(p2=fork()=0) execv("/home/ilbear/ 桌面/build-copy-Desktop_Qt_5_4_1_GCC_64bit-Debug/copy",NULL); else if( p3=fork()=0) execv("/home/ilbear/ 桌面 /build-put-Desktop_Qt_5_4_1_GCC_64bit-Debug/put",NULL); waitpid(p1,NULL,0); waitpid(p2,NULL,0); waitpid(p3,NULL,0
12、);return ();#子進(jìn)程 get#include ""#include ""#include <>#include <>#include <QtCore>#include <>MainWindow:MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:MainWindow),sharememory1("share1")ui->setupUi(this); setWindowTitle("get&q
13、uot;); setWindowFlags(Qt:Dialog);move(0,0); resize(500,500);char str128,f_id128; sprintf(str,"%d",getpid(); sprintf(f_id,"%d",getppid(); ui->textBrowser->setText("get"); ui->textBrowser_2->setText(str); ui->textBrowser_3->setText(f_id);QTimer *timer =
14、new QTimer(this);connect(timer, SIGNAL(timeout(), this, SLOT(timerUpDate(); timer->start(1);MainWindow: MainWindow ()delete ui;void MainWindow:timerUpDate()QDateTime time = QDateTime:currentDateTime();QString str = ("yyyy-MM-dd hh:mm:ss dddd"); ui->labelCurDate->setText(str);#子進(jìn)程
15、copy#include ""#include ""#include <QtCore>#include <>#include <>#include <>MainWindow:MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui:MainWindow),sharememory1("share1"),sharememory2("share2") char str128,f_id128; ui->setu
16、pUi(this);setWindowTitle("copy"); setWindowFlags(Qt:Dialog);move(500,500); resize(500,500);sprintf(str,"%d",getpid(); sprintf(f_id,"%d",getppid(); ui->textBrowser->setText("copy");ui->textBrowser_2->setText(str); ui->textBrowser_3->setText(f_
17、id);QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout(), this, SLOT(timerUpDate(); timer->start(1);MainWindow: MainWindow ()delete ui;void MainWindow:timerUpDate()QDateTime time = QDateTime:currentDateTime();QString str = ("yyyy-MM-dd hh:mm:ss dddd"); ui->labelCurDate-&
18、gt;setText(str);#子進(jìn)程 put#include ""#include ""#include <QtCore>#include <>#include <>#include <>MainWindow:MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui:MainWindow),sharememory2("share2")char str128,f_id128; ui->setupUi(this);setW
19、indowTitle("put"); setWindowFlags(Qt:Dialog);move(1000,0); resize(500,500);sprintf(str,"%d",getpid(); sprintf(f_id,"%d",getppid();ui->textBrowser->setText("put"); ui->textBrowser_2->setText(str);ui->textBrowser_3->setText(f_id);QTimer *timer
20、= new QTimer(this); connect(timer, SIGNAL(timeout(), this, SLOT(timerUpDate(); timer->start(1);MainWindow: MainWindow ()delete ui;void MainWindow:timerUpDate()QDateTime time = QDateTime:currentDateTime();QString str = ("yyyy-MM-dd hh:mm:ss dddd"); ui->labelCurDate->setText(str);4.
21、2 實(shí)驗(yàn)二4.2.1 實(shí)驗(yàn)要求掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯內(nèi)核方法,增加一個新的系統(tǒng)調(diào)用,另編 寫一個應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。4.2.2 具體實(shí)現(xiàn)(1) 系統(tǒng)調(diào)用的原理 用戶進(jìn)程不能訪問內(nèi)核所占內(nèi)存空間,也不能調(diào)用內(nèi)核函數(shù)。進(jìn)程調(diào)用一個特 殊的指令,這個指令會跳到一個事先定義的內(nèi)核中的一個位置。在 Intel CPU 中,由中斷 INT 0x80 實(shí)現(xiàn)。 (與 DOS 功能調(diào)用 int0x21 很相似)跳轉(zhuǎn)到的內(nèi)核位置叫做sysem_cal。檢查系統(tǒng)調(diào)用號,這個號碼代表進(jìn)程請求哪種服務(wù)。然后,它查看系統(tǒng) 調(diào)用表(sys_call_table找到所調(diào)用的內(nèi)核函數(shù)入口地址。接著,就調(diào)用
22、函數(shù),等返回 后,做一些系統(tǒng)檢查,最后返回到進(jìn)程(如果這個進(jìn)程時間用盡,就返回到其他進(jìn) 程)。(2) 編寫新的系統(tǒng)調(diào)用程序 新的系統(tǒng)調(diào)用程序?qū)崿F(xiàn)的功能是:將一個文件中的內(nèi)容拷貝到另一個文件中。這個系統(tǒng)調(diào)用的參數(shù)是兩個 char*型的字符指針SourceFile GoalFile,分別表示源 文件和目標(biāo)文件的路徑名。用戶進(jìn)程中的 open read write、close函數(shù)此時對應(yīng)內(nèi) 核函數(shù) sys_open、 sys_read、 sys_write、 sys_close 函數(shù)。循環(huán)拷貝的判斷條件還是 sys_read 的返回值,當(dāng)其大于 0 的時候執(zhí)行循環(huán),否則表示源文件已拷貝到了目標(biāo)文件。
23、 mm_segment_t類型的變量fs的作用是在讀寫文件前得到當(dāng)前 fs,避免使用的緩沖 區(qū)超過了用戶空間的地址范圍而報錯。詳細(xì)代碼見。(3)編譯內(nèi)核 下載并解壓內(nèi)核先到Linux官方網(wǎng)站下載內(nèi)核。打開終端,使用sudo su獲取root權(quán)限,然后使 用cp命令將復(fù)制到文件夾/usr/src下,復(fù)制完畢之后將其解壓,用到的命令為:xz -d 和 tar xvf 。 修改內(nèi)核新的內(nèi)核解壓完畢后,使用 命令進(jìn)入目錄 。然后使用命令 sudo gedit kernel/ 打開,將新的系統(tǒng)調(diào)用程序復(fù)制到該文件的文件末尾,保存退出,系統(tǒng)調(diào)用程序詳 細(xì)代碼見。使用命令 sudo gedit arch/x
24、86/syscalls/ 打開 添加系統(tǒng)調(diào)用號。在該文件中添加 一行內(nèi)容317 common mycall sys_mycall,其中系統(tǒng)調(diào)用號317不是固定的,只要該 文件中沒有出現(xiàn)的數(shù)字都可以使用。添加之后保存退出。使 用 命 令 sudo gedit include/asm-generic/ 打 開 , 在 “#endif /* _ASM_GENERIC_SYSCALLS_H */ 這一行的上面一行添加新的系統(tǒng)調(diào)用程序的 函數(shù)定義,即:#ifndef sys_mycallasmlinkage int sys_mycall(char* sourceFile,char* destFile);
25、#endif然后保存退出。 編譯內(nèi)核在編譯內(nèi)核之前先要安裝 n curses庫,使用命令sudo apt-get in stall lib ncurses5-dev 安裝。安裝完畢后,進(jìn)入/usr/src/目錄下,新建一個腳本文件,通過命令gedit打開 該腳本文件進(jìn)行編輯。將以下內(nèi)容添加到腳本中:#!/bin/bashmake mrpropermake menuconfigmake depmake cleanmake bzlmage -4make modules -4make modules_install-j4make install -j4mkinitramfs -o /boot/ up
26、date-grub reboot保存退出,然后修改腳本文件的權(quán)限,使其可以對內(nèi)核文件進(jìn)行操作,修改權(quán) 限的命令為 chmod 777 。權(quán)限修改成功后,在終端中運(yùn)行該腳本文件 ./,內(nèi)核開始 編譯,期間會出現(xiàn)配置linux過程,直接先save,然后0K,再exit即可,繼續(xù)等待 編譯結(jié)束。編譯完成后,電腦會自動重啟, 重啟選擇進(jìn)入 Ubuntu 高級選項(xiàng),在選項(xiàng) 列表中選擇新內(nèi)核進(jìn)入,打開終端輸入un ame -a查看系統(tǒng)版本號,執(zhí)行情況如下所示: 說明已經(jīng)成功進(jìn)入新的內(nèi)核中。(4)編寫系統(tǒng)調(diào)用測試程序需要用到的頭文件是、。在 main 函數(shù)中直接調(diào)用頭文件中定義的函數(shù) syscall, 該函
27、數(shù)有三個參數(shù),第一個參數(shù)是系統(tǒng)調(diào)用號( 317),第二個參數(shù)是源文件(,即 測試程序的源代碼文件) ,第三個參數(shù)是目標(biāo)文件() 。程序運(yùn)行結(jié)果為:在所在目錄下新建了一個文件,并將中的代碼拷貝到了中。 詳細(xì)代碼見。4.2.3 源代碼(1) 系統(tǒng)調(diào)用程序asmlinkage int sys_mycall(char* SourceFile,char* GoalFile)int source=sys_open(SourceFile,O_RDONL Y,0);int goal=sys_open(GoalFile,O_WRONL Y|O_CREA T|O_TRUNC,0600);char buff4096
28、;mm_segment_t fs;fs = get_fs();set_fs(get_ds();int i;if(source>0 && goal>0)doi=sys_read(source,buff,4096); sys_write(goal,buff,i);while(i);elseprintk("Error!");sys_close(source);sys_close(goal);set_fs(fs);return 10;(2) 測試程序#include <>#include <>#include <>in
29、t main()syscall(317,"","");return 0;4.3 實(shí)驗(yàn)三4.3.1 實(shí)驗(yàn)要求掌握增加設(shè)備驅(qū)動程序的方法。通過模塊方法,增加一個新的設(shè)備驅(qū)動程序, 其功能可以簡單。(實(shí)現(xiàn)字符設(shè)備的驅(qū)動)4.3.2 具體實(shí)現(xiàn)(1) Linux 核心是一種 monolithic 類型的內(nèi)核,即單一的大核心,另外一種形式是 MicroKernel ,核心的所有功能部件都被拆成獨(dú)立部分, 這些部分之間通過嚴(yán)格的 通訊機(jī)制進(jìn)行聯(lián)系。 Linux 內(nèi)核是一個整體結(jié)構(gòu),因此向內(nèi)核添加任何東西 .或者刪 除某些功能,都十分困難 。為了解決這個問題,引入了模塊
30、機(jī)制, 從而可以動態(tài)的 在內(nèi)核中添加或者刪除模塊。模塊一旦被插入內(nèi)核,就和內(nèi)核其他部分一樣。Linux 內(nèi)核中的設(shè)備驅(qū)動程序是一組常駐內(nèi)存的具有特權(quán)的共享庫,是低級硬件處 理例程。 對用戶程序而言, 設(shè)備驅(qū)動程序隱藏了設(shè)備的具體細(xì)節(jié),對各種不同設(shè)備提供了一致的接口, 一般來說是把設(shè)備映射為一個特殊的設(shè)備文 件,用戶程序可以 像對其它文件一樣對此設(shè)備文件進(jìn)行操作。Linux 支持 3種設(shè)備: 字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。 設(shè)備由一個主設(shè)備號和一 個次設(shè)備號標(biāo)識。 主設(shè)備號唯一標(biāo)識了設(shè)備類型, 即設(shè)備驅(qū)動程序類型, 它是塊設(shè) 備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。 次設(shè)備號僅由設(shè)備驅(qū)動程序解釋 ,一般
31、用于 識別在若干可能的硬件設(shè)備中, I/O 請求所涉及到的那個設(shè)備。典型的 Linux 模塊實(shí)現(xiàn)機(jī)制有如下幾步: 注冊設(shè)備:在系統(tǒng)初啟或者加載模塊的時候,必須將設(shè)備登記到相應(yīng)的設(shè)備 數(shù)組,并返回主設(shè)備號。 定義功能函數(shù):對于每一個驅(qū)動函數(shù)來說,都有一些和此設(shè)備密切相關(guān)的功能函數(shù)。以最常用的塊設(shè)備或者字符設(shè)備來說,都存在著諸如open()、read(這一類的操作。當(dāng)系統(tǒng)調(diào)用這些調(diào)用時,將自動的使用驅(qū)動函數(shù)中特定的模塊來實(shí)現(xiàn)具體 的操作。 卸載設(shè)備:在不用這個設(shè)備時,可以將它卸載,主要是從/proc中取消這個設(shè) 備的特殊文件。(2) 編寫 Makefile 文件Makefile 文件用于編譯設(shè)備驅(qū)
32、動程序,其內(nèi)容如下:ifneq ($(KERNELRELEASE),)#kbuild syntax.#模塊的文件組成mymodule-objs :=#生成的模塊文件名obj-m :=elsePWD :=$(shell pwd)KVER :=$(shell uname -r)KDIR :=/lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *. *.ko .tmp_versions#$(MAKE) -C $(KDIR) M=$(PWD
33、) cleanendif(3) 編寫設(shè)備功能函數(shù)編寫設(shè)備驅(qū)動程序的主要工作就是編寫子功能函數(shù)并填充file_operations的各個域。結(jié)構(gòu)體file_operations的具體定義如下:struct file_operati ons struct module *owner; wner = THIS_MODULE,.llseek = my_llseek,.read = my_read,.write = my_write,.ope n = my_ope n,; 一int in it_module(void) _int dev_ num;dev_ num = register_chrdev(O
34、,"MyDeviceDriver", &fops);if (dev_num < 0) prin tk(KERNNFO "MyDeviceDriver: FAIL to get major number'n"); retur n dev_ num; _if (devNum_major = 0) devNum_major = dev_ num;ize = DEV_SIZE;-(*devp).data = kmalloc(DEV_SIZE, GFP_KERNEL);memset(*devp).data, 0, (*devp).size);
35、ata);rg(passWord初始化 QString 類型的 變量sudo,再把sudo轉(zhuǎn)換成char*類型,然后調(diào)用system函數(shù)執(zhí)行關(guān)機(jī)命令。(4) 界面設(shè)計新建一個Qt Widgets Application工程,用setWindowTitle函數(shù)將主窗口的標(biāo)題 改為“pro(進(jìn)程管理器”設(shè)置窗口的初始大小為(650, 500),初始位置為顯示屏左 上角,即坐標(biāo)原點(diǎn)。在主窗口底部添加一個狀態(tài)欄控件,用QStatusBar實(shí)現(xiàn)。狀態(tài)欄中添加三個標(biāo)簽和一個按鈕,三個標(biāo)簽分別用于顯示當(dāng)前時間、CPU使用率、內(nèi)存使用率,這三個信息的顯示函數(shù)都與定時器 QTimer綁定,隨時間自動更新,按鈕用
36、于觸發(fā)關(guān)機(jī) 函數(shù)。在主窗口的窗體中添加tabWidget控件,設(shè)置四個tab選項(xiàng)卡tab_1、tab_2、tab_3 tab_4o tab_1選項(xiàng)卡用于顯示主機(jī)名、系統(tǒng)啟動時間、系統(tǒng)運(yùn)行時間、系統(tǒng)版本號、 CPU型號和主頻等信息,這些內(nèi)容全部用QLabel類的標(biāo)簽顯示,其中系統(tǒng)運(yùn)行時間和CPU主頻函數(shù)是槽函數(shù),都和定時器 QTimer綁定,隨著時間自動更新。tab_2 選項(xiàng)卡用于顯示進(jìn)程詳細(xì)信息,進(jìn)程詳細(xì)信息包括進(jìn)程名、pid、ppid、內(nèi)存占用和優(yōu)先級,這些信息用tableWidget控件顯示,tableWidget控件設(shè)置為禁止選中、禁止 修改,tableWidget的列數(shù)是固定的5列,行
37、數(shù)動態(tài)確定,由獲取所有進(jìn)程詳細(xì)信息 的函數(shù) get_pid_info 的返回值提供;這樣做的好處是,當(dāng)創(chuàng)建新進(jìn)程或者殺死進(jìn)程 時,tableWidget不會出現(xiàn)行數(shù)不夠或者有空行的情況,并且Processlnfo函數(shù)(即控制顯示進(jìn)程信息的函數(shù))與 QTimer 綁定,隨時間定時更新。 tab_3 選項(xiàng)卡用于提 供查詢進(jìn)程、殺死進(jìn)程、創(chuàng)建新進(jìn)程的操作面板,查詢進(jìn)程的輸入框用 lineEdit 控 件實(shí)現(xiàn),該控件的好處是可以直接調(diào)用控件所包含的方法 text 獲取輸入框的內(nèi)容, 便于查詢進(jìn)程信息;在 lineEdit 下方放置的是 tableWidget 控件,同樣,該控件禁止 選中、禁止修改,用
38、于顯示查詢的進(jìn)程詳細(xì)信息;tableWidget控件下方是關(guān)閉進(jìn)程的按鈕,當(dāng)點(diǎn)擊該按鈕時便會觸發(fā) killProcess 函數(shù)關(guān)閉進(jìn)程;創(chuàng)建進(jìn)程的進(jìn)程名輸 入框同樣也是用lineEdit控件實(shí)現(xiàn),當(dāng)點(diǎn)擊運(yùn)行”按鈕時便會觸發(fā)CreateProcess函 數(shù)。tab_4選項(xiàng)卡用于顯示CPU使用率歷史記錄曲線和內(nèi)存使用率歷史記錄曲線。( 5)程序運(yùn)行結(jié)果4.3.3 源代碼#,包含各種槽函數(shù)#ifndef MAlNWlNDOW_H#define MAlNWlNDOW_H#include <QMainWindow>#include <QLabel>#include <QPu
39、shButton>class QTabWidget;namespace Ui class MainWindow;class MainWindow : public QMainWindowQ_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);MainWindow();private:Ui:MainWindow *ui;private:QPushButton* shutButton;QLabel* NowTimeLabel;QLabel* CPUUseLabel;QLabel* MemUseLabel;QTabWidget* tabw
40、idget;QList<float> yList;QList<float> yList1;void init_StatusBar();void HostName();void BootTime();void OSType();void add_point(float cpuRate);void UpdateCPULine();void add_point_mem(float memRate);void UpdateMemLine();private slots:void NowTime();void CPURate();void MemRate();void run_t
41、ime();void CPUInfo();void ProcessInfo();void QueryProcess();void PasswordToShutdown();void KillProcess();void CreateProcess();#endif rg(ostype).arg(osrelease);fclose(fp1);fclose(fp2);return os;#endif otal=memtotal;(*memStat).free=memfree;(*memStat).buffers=membuffers;(*memStat).cached=memcached;();f
42、loat clacu_memRate(mem_use *memStat)float memRate=;memRate=(float)(*memStat).total -(*memStat).free+(*memStat).buffers+(*memStat).cached)*(*memStat).total); return memRate;#endif rg(cpuRate).arg("%");CPUUseLabel->setText(str);CPUUseLabel->setAlignment(Qt:AlignCenter); add_point(cpuRa
43、te);void MainWindow:MemRate()mem_use MemUse;QString str;float memRate;get_mem_use_stat(&MemUse);memRate=clacu_memRate(&MemUse);memRate=(int)(memRate*100+)/;str=QString(" 內(nèi)存使用率 : %1%2").arg(memRate).arg("%"); MemUseLabel->setText(str);MemUseLabel->setAlignment(Qt:Ali
44、gnCenter); add_point_mem(memRate);void MainWindow:HostName()char * str;QString hostname; str=(char*)malloc(7*sizeof(char);str=get_hostname(); hostname=QString(str);ui->hostlabel->setText(hostname);void MainWindow:run_time()float runTime; runTime=get_run_time_sec();QString run=QString("%1%
45、2").arg(runTime).arg(" 秒 "); ui->runtimelabel->setText(run);void MainWindow:BootTime()QString boot; time_t cur_time = 0;time_t boot_time = 0;struct tm *ptm = NULL;time_t runtime;QString week7=" 星期天 ","星期一 ","星期二 ","星期三 ","星期四 ",&
46、quot;星期五 "," 星期六 " runtime=(time_t)(get_run_time_sec();time(&cur_time);boot_time = cur_time - runtime; ptm = localtime(&boot_time);boot=QString("%1-%2-%3 %4:%5:%6 %7").arg(ptm->tm_year+1900).arg(ptm->tm_mon+1).arg(ptm ->tm_mday).arg(ptm->tm_hour).arg(ptm-
47、>tm_min).arg(ptm->tm_sec).arg(weekptm->tm_wday);ui->bootlabel->setText(boot);void MainWindow:OSType()QString os; os=get_os_type();ui->ostypelabel->setText(os);void MainWindow:PasswordToShutdown()QString passWord;QString sudo;char* command;bool OK;QByteArray ba; passWord=QInputDi
48、alog:getText(this," 輸入密碼 "," 輸入密碼 ",QLineEdit:Normal,"",&OK); if(OK)sudo=QString("echo %1 | sudo -S shutdown -h now").arg(passWord); ba=();command=(); system(command);void MainWindow:CPUInfo()QString processor;QString Hz0,Hz1,Hz2,Hz3;processor=get_processo
49、r();ui->processorlabel0->setText(QString("0: %1").arg(processor);ui->processorlabel1->setText(QString("1: %1").arg(processor);ui->processorlabel2->setText(QString("2: %1").arg(processor);ui->processorlabel3->setText(QString("3: %1").arg
50、(processor);Hz0=get_Hz0();Hz0=QString("%1%2").arg(Hz0).arg("MHz");ui->Hzlabel0->setText(Hz0);Hz1=get_Hz1();Hz1=QString("%1%2").arg(Hz1).arg("MHz");ui->Hzlabel1->setText(Hz1);Hz2=get_Hz2();Hz2=QString("%1%2").arg(Hz2).arg("MHz");
51、ui->Hzlabel2->setText(Hz2);Hz3=get_Hz3();Hz3=QString("%1%2").arg(Hz3).arg("MHz");ui->Hzlabel3->setText(Hz3);void MainWindow:ProcessInfo()int pidNum;int i;QStringList headers;QTableWidgetItem *nameItem;QTableWidgetItem *pidItem;QTableWidgetItem *ppidItem;QTableWidgetIt
52、em *rssItem;QTableWidgetItem *priorityItem;pidNum=get_pid_info();ui->tableWidget->setColumnCount(5);ui->tableWidget->setRowCount(pidNum);headers<<進(jìn)程名 ”<<”pid”<<”ppid”<<” 內(nèi)存占用優(yōu)先級”;ui->tableWidget->setHorizontalHeaderLabels(headers);for(i=0;i<pidNum;i+)name
53、Item=new QTableWidgetItem(QString:fromStdString(procI);ui->tableWidget->setItem(i,0,nameItem);nameItem->setTextAlignment(Qt:AlignCenter);pidItem=new QTableWidgetItem(QString:fromStdString(procInfoi.pid);ui->tableWidget->setItem(i,1,pidItem);pidItem->setTextAlignment(Qt:Ali
54、gnCenter);ppidItem=new QTableWidgetItem(QString:fromStdString(procInfoi.ppid);ui->tableWidget->setItem(i,2,ppidItem);ppidItem->setTextAlignment(Qt:AlignCenter);rssItem=new QTableWidgetItem(QString:fromStdString(procInfoi.rss);ui->tableWidget->setItem(i,3,rssItem);rssItem->setTextAl
55、ignment(Qt:AlignCenter);priorityItem=new QTableWidgetItem(QString:fromStdString(procInfoi.priority);ui->tableWidget->setItem(i,4,priorityItem);priorityItem->setTextAlignment(Qt:AlignCenter);ui->tableWidget->setColumnWidth(0,121);ui->tableWidget->setColumnWidth(1,121);ui->tabl
56、eWidget->setColumnWidth(2,121);ui->tableWidget->setColumnWidth(3,121);ui->tableWidget->setColumnWidth(4,121);ui->tableWidget->setEditTriggers(QAbstractItemView:NoEditTriggers);ui->tableWidget->setSelectionMode(QAbstractItemView:NoSelection);void MainWindow:QueryProcess()QS
57、tring queryitem;int pidNum,i;QStringList headers;QTableWidgetItem *nameItem;QTableWidgetItem *pidItem;QTableWidgetItem *ppidItem;QTableWidgetItem *rssItem;QTableWidgetItem *priorityItem;QHeaderView* headerView = ui->tableWidget_2->verticalHeader();headerView->setHidden(true);ame) | queryite
58、m=QString:fromStdString(procInfoi.pid) break;ui->tableWidget_2->setColumnCount(5);ui->tableWidget_2->setRowCount(1);headers<<進(jìn)程名 ”<<”pid”<<”ppid”<<” 內(nèi)存占用 /KB”<<” 優(yōu)先級”;ui->tableWidget_2->setHorizontalHeaderLabels(headers);nameItem=new QTableWidgetItem(Q
59、String:fromStdString(procI); ui->tableWidget_2->setItem(0,0,nameItem); nameItem->setTextAlignment(Qt:AlignCenter);pidItem=new QTableWidgetItem(QString:fromStdString(procInfoi.pid);ui->tableWidget_2->setItem(0,1,pidItem);pidItem->setTextAlignment(Qt:AlignCenter);ppidItem=new QTableWidgetItem(QString:fromStdString(procInfoi.ppid); ui->tableWidget_2->setItem(0,2,ppidItem); ppidItem-&g
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年黨章黨紀(jì)黨史黨建知識競賽多項(xiàng)選擇題庫及答案(共210道題)
- 2025年激光掃描繪圖機(jī)項(xiàng)目發(fā)展計劃
- 診所裝修環(huán)保保證金協(xié)議
- 農(nóng)業(yè)科技節(jié)水灌溉技術(shù)推廣應(yīng)用策略
- 公司可行性分析報告
- 廣汽充電樁 遠(yuǎn)程
- 垃圾發(fā)電采購
- 高速電動汽車充電樁
- 保險行業(yè)保險科技創(chuàng)新與風(fēng)險管理方案
- 智能家電產(chǎn)品開發(fā)與生產(chǎn)標(biāo)準(zhǔn)
- 阿拉伯國家聯(lián)盟課件
- 油氣管道視頻監(jiān)控系統(tǒng)總體設(shè)計方案
- 知識產(chǎn)權(quán)案件調(diào)解實(shí)務(wù)
- 手術(shù)室護(hù)理查房之甲狀腺切除術(shù)手術(shù)配合
- 毫米波集成電路詳述
- 打印設(shè)備維護(hù)服務(wù)投標(biāo)方案
- JGT454-2014 建筑門窗、幕墻中空玻璃性能現(xiàn)場檢測方法
- 一定溶質(zhì)質(zhì)量分?jǐn)?shù)的氯化鈉溶液的配制
- DB5301∕T 24-2019 園林綠化養(yǎng)護(hù)規(guī)范
- 地坪漆施工合同地坪漆施工合同范本
- 高風(fēng)險供應(yīng)商管理程序(經(jīng)典-專業(yè)-建議收藏)
評論
0/150
提交評論