操作系統(tǒng)實(shí)驗(yàn)_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)實(shí)驗(yàn)實(shí)驗(yàn)一實(shí)驗(yàn)一 Linux登錄與登錄與vi編輯器編輯器實(shí)驗(yàn)?zāi)康模簩?shí)驗(yàn)?zāi)康模?讓學(xué)生熟悉Linux的環(huán)境,掌握Linux系統(tǒng)登錄的方法。 給學(xué)生使用vi創(chuàng)建與編輯文件的機(jī)會(huì)。 vi是UNIX中最常用的編輯器。對(duì)vi編輯器的全面而清晰的理解,對(duì)于后續(xù)內(nèi)容的學(xué)習(xí)至關(guān)重要。n實(shí)驗(yàn)內(nèi)容與要求實(shí)驗(yàn)內(nèi)容與要求: 首先,首先,登錄Linux命令login的使用。 其次,其次,使用vimtutor e查看vi編輯器的相關(guān)幫助文檔,讓學(xué)生自行閱讀使用方法。 最后,最后,通過(guò)第二步的閱讀幫助,完成以下任務(wù):(1)創(chuàng)建一個(gè)文件(2)保存退出一個(gè)文件及不保存退出一個(gè)文件(3)在文本中使用不同的鍵進(jìn)行光標(biāo)的移動(dòng)

2、(4)在一個(gè)文件中加入、刪除與修改文本(5)設(shè)定選項(xiàng)以自定義編輯環(huán)境(6)調(diào)用命令行編輯功能實(shí)驗(yàn)二實(shí)驗(yàn)二 Linux常用命令與常用命令與Linux下下C程序設(shè)計(jì)程序設(shè)計(jì)n實(shí)驗(yàn)?zāi)康模?讓學(xué)生熟悉Linux常用命令,對(duì)Linux命令有一個(gè)熟悉的了解。 進(jìn)一步熟悉vi編輯器的使用。 掌握在linux下的編譯命令gcc及C語(yǔ)言程序的運(yùn)行。n實(shí)驗(yàn)內(nèi)容與要求 LinuxLinux下常用命令的使用下常用命令的使用 (1) Cp(1) Cp:拷貝文件命令:拷貝文件命令 將一個(gè)檔案拷貝至另一檔案,或?qū)?shù)個(gè)檔案拷貝至另一目錄。 格式為cp options source destcp options source

3、dest。 選項(xiàng)的說(shuō)明如下: -a 盡可能將檔案狀態(tài)、權(quán)限等資料都照原狀予以復(fù)制。 -f 若目的地已經(jīng)有相同檔名的檔案存在,則在復(fù)制前先予以刪除再行復(fù)制。范例:范例: (a) 將檔案 aaa 復(fù)制(已存在),并命名為 bbb : cp aaa bbb (b) 將所有的C語(yǔ)言程式拷貝至 Finished 子目錄中 : cp *.c FinishednCd:切換目錄:切換目錄 該命令的作用是切換當(dāng)前目錄至另一目錄。 格式為cd dirName。 下面是一些小技巧: cd 進(jìn)入用戶主目錄; cd - 返回進(jìn)入此目錄之前所在的目錄; cd . 返回上級(jí)目錄(若當(dāng)前目錄為“/“,則執(zhí)行完后還在“/”;”

4、.”為上級(jí)目錄的意思); cd ./. 返回上兩級(jí)目錄;nMkdirMkdir:創(chuàng)建新文件夾命令:創(chuàng)建新文件夾命令 所創(chuàng)建的文件夾(目錄)不能與其父目錄(即父文件夾)中的文件名重名,即同一個(gè)目錄下不能有同名的(區(qū)分大小寫(xiě))。 格式為:格式為:mkdir DirNamemkdir DirName 實(shí)例: 在/home/cc/下面創(chuàng)建以“itorg”命名的文件夾。 格式:mkdir /home/cc/itorg n使用vi編輯器編寫(xiě)一個(gè)C語(yǔ)言程序Hello World #include int main(void) printf (Hello world, Linux programming!n)

5、; return 0; ngccgcc編譯:編譯: 將程序存為hello.c。 編譯:編譯:gcc -o hello hello.c實(shí)驗(yàn)三實(shí)驗(yàn)三 Linux進(jìn)程的異步并發(fā)執(zhí)行進(jìn)程的異步并發(fā)執(zhí)行n實(shí)驗(yàn)?zāi)康?.了解進(jìn)程與程序的區(qū)別,加深對(duì)進(jìn)程概念的理解;2.掌握進(jìn)程并發(fā)執(zhí)行的原理,理解進(jìn)程并發(fā)執(zhí)行的特點(diǎn),區(qū)分進(jìn)程并發(fā)執(zhí)行與串行執(zhí)行;3.了解fork( )系統(tǒng)調(diào)用的返回值,掌握用fork()創(chuàng)建進(jìn)程的方法;4.熟悉wait、exit等系統(tǒng)調(diào)用。n實(shí)驗(yàn)內(nèi)容與要求1編寫(xiě)一C語(yǔ)言程序,實(shí)現(xiàn)在程序運(yùn)行時(shí)通過(guò)系統(tǒng)調(diào)用fork( )創(chuàng)建兩個(gè)子進(jìn)程,使父、子三進(jìn)程并發(fā)執(zhí)行,父親進(jìn)程執(zhí)行時(shí)屏幕顯示“I am fat

6、her”,兒子進(jìn)程執(zhí)行時(shí)屏幕顯示“I am son”,女兒進(jìn)程執(zhí)行時(shí)屏幕顯示“I am daughter”。2多次連續(xù)反復(fù)運(yùn)行這個(gè)程序,觀察屏幕顯示結(jié)果的順序,直至出現(xiàn)不一樣的情況為止。記下這種情況,試簡(jiǎn)單分析其原因。3修改程序,在父、子進(jìn)程中分別使用wait、exit等系統(tǒng)調(diào)用“實(shí)現(xiàn)”其同步推進(jìn),多次反復(fù)運(yùn)行改進(jìn)后的程序,觀察并記錄運(yùn)行結(jié)果。n程序參考:(僅供參考)#include #include void main() int i; pid_t pid = fork(); if ( pid = 0 ) /* 子進(jìn)程程序 */ for ( i = 1; i 1000; i + ) prin

7、tf(I am son n); else /* 父進(jìn)程程序*/ for ( i = 1; i 1000; i + ) printf(I am father n); nfork() 當(dāng)程序執(zhí)行到下面的語(yǔ)句: pid=fork(); OS創(chuàng)建子進(jìn)程。子進(jìn)程和父進(jìn)程的可執(zhí)行程序是同一個(gè)程序;上下文和數(shù)據(jù),絕大部分就父進(jìn)程的拷貝,但它們是兩個(gè)相互獨(dú)立的進(jìn)程! 當(dāng)前是父進(jìn)程執(zhí)行到fork調(diào)用即將返回(此時(shí)子進(jìn)程不占有CPU)。 父進(jìn)程繼續(xù)執(zhí)行,OS對(duì)fork的實(shí)現(xiàn),使這個(gè)系統(tǒng)調(diào)用在父進(jìn)程中返回剛剛創(chuàng)建的子進(jìn)程的pid(一個(gè)正整數(shù)),所以下面的if語(yǔ)句 pid=0的分支不會(huì)執(zhí)行。所以輸出i am fath

8、er 子進(jìn)程在之后的某個(gè)時(shí)候得到調(diào)度,它的PCB的內(nèi)容被換入,占用 CPU。OS對(duì)fork的實(shí)現(xiàn),使子進(jìn)程中fork返回0。 所以在這個(gè)子進(jìn)程中pid=0。這個(gè)進(jìn)程繼續(xù)執(zhí)行的過(guò)程中,if語(yǔ)句中 pid=0是true。所以輸出i am sonn獲得進(jìn)程ID的函數(shù)getpid()#include #include main () pid_t pid = fork();if (pid = 0) printf(“i am son, pid = %dn”,getpid(); else printf(“i am father, pid = %dn,getpid(); nwait 和和 exit 函數(shù)函數(shù)n

9、wait(等待子進(jìn)程中斷或結(jié)束)(等待子進(jìn)程中斷或結(jié)束) 定義函數(shù) pid_t wait (int * status);n返回值返回值 如果執(zhí)行成功則返回子進(jìn)程的ID,如果有錯(cuò)誤發(fā)生則返回-1。n進(jìn)程一旦調(diào)用wait,就立即阻塞自己,直到有信號(hào)來(lái)到或子進(jìn)程結(jié)束。如果有子進(jìn)程退出,wait 就會(huì)收集這個(gè)子進(jìn)程的信息, 并把它徹底銷(xiāo)毀后返回;如果沒(méi)有找到這樣一個(gè)子進(jìn)程,wait就會(huì)一直阻塞在這里,直到有一個(gè)出現(xiàn)為止。n注意:注意: 如果在調(diào)用wait時(shí)子進(jìn)程已經(jīng)結(jié)束,則wait會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status 返回,而子進(jìn)程的ID也會(huì)一快返回。如果不在意結(jié)束狀態(tài)

10、值,則參數(shù)status 可以設(shè)成NULL。n#include#include#include#includeint main() int status,i; pid_t pid = fork(); if(pid = =0) printf(“I am son .pid =%dn”,getpid(); exit(5); else sleep(1); printf(“I am father, wait for son.n”; pid=wait(&status); i=WEXITSTATUS(status); printf(“sons pid =%d .exit status=%dn”,pid

11、,i); n執(zhí)行示例: I am son. pid=1501I am father, wait for son.sons pid =1501,exit status =5n實(shí)驗(yàn)三遇到的問(wèn)題:n問(wèn)題一 pid_t pid1 = fork(); pid_t pid2 = fork();if (pid1 = 0) printf(“i am son”); else if (pid2 = 0) printf(“i am daught”); else printf(“i am father); pid_t pid1 = fork();pid_t pid2 = fork();pid1 = 兒子兒子idPid

12、2=女兒女兒idpid_t pid1 = fork();pid_t pid2 = fork();pid1 = 0pid2 = 孫子孫子id父進(jìn)程兒子進(jìn)程pid_t pid1 = fork();pid_t pid2 = fork();pid1 = 兒子進(jìn)程兒子進(jìn)程pid2 = 0女兒進(jìn)程pid_t pid1 = fork();pid_t pid2 = fork();pid1 = 0pid2 = 0孫子進(jìn)程if (pid1 = 0) printf(“i am son”); else if (pid2 = 0) printf(“i am daught”); else printf(“i am fat

13、her); pid_t pid1; pid_t pid2; pid1 = fork(); if (pid1 = 0) printf(“i am son”); else pid2 = fork (); if (pid2 = 0) printf(“i am daught); else printf(“i am father); pid_t pid1; pid_t pid2; int i; for (i=0; i2; i+) pid1 = fork(); if (pid1 = 0) printf(“i am son”); else pid2 = fork (); if (pid2 = 0) prin

14、tf(“i am daught); else printf(“i am father); 輸出:輸出: I am daught I am father I am sonpid_t pid1 = fork(); pid_t pid2 = fork();父進(jìn)程兒子進(jìn)程 女兒進(jìn)程 輸出: father daught son father daught son father daught son father daught son第二遍循環(huán)第二遍循環(huán)n問(wèn)題三pid_t pid = fork(); if ( pid = 0 ) for ( i = 1; i 1000; i + ) printf(I am

15、 son n); exit(5); else for ( i = 1; i 1000; i + ) printf(“I am father, wait for son.n”; pid=wait(&status); printf(“sons pid =%dn”,pid); 輸出:I am sonI am father, wait for son.sons pid = 1015sons pid = -1sons pid = -1sons pid = -1sons pid = -1 sons pid = -1 原因:第一遍循環(huán)時(shí)原因:第一遍循環(huán)時(shí)子進(jìn)程已經(jīng)退出。子進(jìn)程已經(jīng)退出。實(shí)驗(yàn)四實(shí)驗(yàn)四

16、通道通信通道通信n實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)?zāi)康倪M(jìn)一步熟悉linux的編程環(huán)境和vi編輯器,熟悉linux環(huán)境下C語(yǔ)言程序的編譯和運(yùn)行。進(jìn)一步掌握父子進(jìn)程間的通信原理和fork()函數(shù)。熟悉并掌握管道通信的原理,以及l(fā)inux環(huán)境下提供的pipe()、write()及read()函數(shù)。能夠編寫(xiě)出管道通信的程序,并調(diào)試通過(guò)。n實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)內(nèi)容pipe()函數(shù):創(chuàng)建管道的方法,函數(shù)原型為int pipe(int filedes2);write()函數(shù):讀取數(shù)據(jù)方法,函數(shù)原型為: int write(int pipe_fd,char *buffer,size_t len);read()函數(shù):寫(xiě)入數(shù)據(jù)的方法,函數(shù)原

17、型為: int read(int pipe_fd,char *buffer,size_t len);npipe 建立管道 頭文件:頭文件: #include 定義函數(shù)定義函數(shù): int pipe(int filedes2); 函數(shù)說(shuō)明:函數(shù)說(shuō)明: 建立管道,并將文件描述符由數(shù)組filedes 返回。 filedes0為管道里的讀取端,用read從管道中讀數(shù)據(jù) filedes1則為管道的寫(xiě)入端,用write向管道中寫(xiě)數(shù)據(jù)。 返回值返回值: 若成功則返回0,否則返回-1。 #include #include #define INPUT 0 #define OUTPUT 1 int main() i

18、nt filedes 2; /*定義子進(jìn)程號(hào) */ pid_t pid; char buf500; int returned_count; /*創(chuàng)建無(wú)名管道*/ pipe(filedes); /*創(chuàng)建子進(jìn)程*/ if (pid = fork() = - 1) printf(Error in forkn); exit(1); /*執(zhí)行子進(jìn)程*/ if (pid = 0) printf(in the spawned (child) process.n); /*子進(jìn)程向父進(jìn)程寫(xiě)數(shù)據(jù),關(guān)閉管道的讀端*/ close(filedesINPUT); write(filedesOUTPUT, test data, strlen(test data); exit(0); else /*執(zhí)行父進(jìn)程*/ printf(in the spawning (parent) process.n); /*父進(jìn)程從管道讀取子進(jìn)程寫(xiě)的數(shù)據(jù),關(guān)閉管道的寫(xiě)端*/ close(filedesOUTPUT); returned_count = read(filedesI

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論