操作系統(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è)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、歡迎共閱暨南大學(xué)本科實(shí)驗(yàn)報(bào)告專(zhuān)用紙一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)進(jìn)程的創(chuàng)建、撤銷(xiāo)和運(yùn)行加深對(duì)進(jìn)程概念和進(jìn)程并發(fā)執(zhí)行的理解,明確進(jìn)程 與程序之間的區(qū)別。二、實(shí)驗(yàn)環(huán)境及設(shè)備(一) 實(shí)驗(yàn)室名稱(chēng):計(jì)算機(jī)實(shí)驗(yàn)室(二) 主要儀器設(shè)備:PC 機(jī)、Linux 操作系統(tǒng)環(huán)境I1三、實(shí)驗(yàn)內(nèi)容- -(1) 編寫(xiě)一段程序,使用系統(tǒng)調(diào)用 fork()來(lái)創(chuàng)建兩個(gè)子進(jìn)程,并由父進(jìn)程重復(fù) 顯示字符某字符串和自己的標(biāo)識(shí)數(shù),而子進(jìn)程則重復(fù)顯示某字符串和自己的標(biāo)識(shí) 數(shù)。(2)編寫(xiě)一段程序,使用系統(tǒng)調(diào)用 fork()來(lái)創(chuàng)建一個(gè)子進(jìn)程。子進(jìn)程通過(guò)系統(tǒng)調(diào)用exec()更換自己的執(zhí)行代碼, 顯示新的代碼后, 調(diào)用 exit()結(jié)束。 而父進(jìn)程則調(diào)用 w

2、aitpid()等待子進(jìn)程結(jié)束,并在子進(jìn)程結(jié)束后顯示子進(jìn)程的標(biāo)識(shí)符,然后正常結(jié)束。四、實(shí)驗(yàn)調(diào)試分析1 1、實(shí)驗(yàn)函數(shù)說(shuō)明(1)fork ()創(chuàng)建新進(jìn)程要?jiǎng)?chuàng)建一個(gè)進(jìn)程,最基本的系統(tǒng)調(diào)用是 fork。系統(tǒng)調(diào)用 fork 用于派生一個(gè)進(jìn)程,頭文件:#in elude 函數(shù)定義:int fork( void );返回值:子進(jìn)程中返回 0,父進(jìn)程中返回子進(jìn)程 ID,出錯(cuò)返回-1函數(shù)說(shuō)明:一個(gè)現(xiàn)有進(jìn)程可以調(diào)用 fork 函數(shù)創(chuàng)建一個(gè)新進(jìn)程。由 fork 創(chuàng)建的新 進(jìn)程被稱(chēng)為子進(jìn)程(child process)。fork 函數(shù)被調(diào)用一次但返回兩次。兩次返 回的唯一區(qū)別是子進(jìn)程中返回 0 值而父進(jìn)程中返回子進(jìn)程

3、 ID。子進(jìn)程是父進(jìn)程 的副本,它將獲得父進(jìn)程數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)程持有的 是上述存儲(chǔ)空間的 副本”這意味著父子進(jìn)程間不共享這些存儲(chǔ)空間,它們之間共享的存儲(chǔ)空間只有代碼段。(2)exec 函數(shù)族頭文件:#in clude 函數(shù)族:歡迎共閱int execl(c onst char *path, const char *arg, .);int execlp(c onst char *file, const char *arg, .);int execle(c onst char *path, const char *arg, const char *en vp);int ex

4、ecv(c onst char *path, const char *argv);int execve(c onst char *path, const char *argv, const char *en vp;int execvp(c onst char *file, const char *argv);參數(shù)說(shuō)明:Li rJIexeclexecl 的第一個(gè)參數(shù)是包括路徑的可執(zhí)行文件,后面是列表參數(shù),列表的第一個(gè) 為命令path,接著為參數(shù)列表,最后必須以NULL 結(jié)束。JI ,: |execlpexeclp 的第一個(gè)參數(shù)可以使用相對(duì)路徑或者絕對(duì)路徑。execleexecle 最后包括指向一

5、個(gè)自定義環(huán)境變量列表的指針, 此列表必須以 NULL 結(jié)束execv, v 表示 path 后面接收的是一個(gè)向量,即指向一個(gè)參數(shù)列表的指針,注意 這個(gè)列表的最后一項(xiàng)必須為 NULL。execveexecve,path 后面接收一個(gè)參數(shù)列表向量,并可以指定一個(gè)環(huán)境變量列表向量execvpexecvp 第一個(gè)參數(shù)可以使用相對(duì)路徑或者絕對(duì)路徑,v 表示后面接收一個(gè)參數(shù)列表向量。execexec 被調(diào)用時(shí)會(huì)替換調(diào)用它的進(jìn)程的代碼段和數(shù)據(jù)段(但是文件描述符不變),直接返回到調(diào)用它的進(jìn)程的父進(jìn)程,如果出錯(cuò),返回-1 并設(shè)置 errno。(3) exit ()終止進(jìn)程函數(shù)電*1 I頭文件:#i nclude

6、 exit()函數(shù)的作用是:直接使進(jìn)程停止運(yùn)行,清除其使用的內(nèi)存空間,并清除其 在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu)。(4)waitpid()父進(jìn)程等待子進(jìn)程中等或結(jié)束后才執(zhí)行頭文件:#i nclude 或 #i nclude定義函數(shù):pid_t waitpid(pid_t pid,i nt * status,i nt opti on s);函數(shù)說(shuō)明:waitpid()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來(lái)到或子進(jìn)程結(jié)束。如果在調(diào)用waitpid()時(shí)子進(jìn)程已經(jīng)結(jié)束,則 waitpid()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status 返回,而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一起返回。如果不在意結(jié)

7、束狀態(tài)值,則參數(shù) status可以設(shè)成 NULL。參數(shù) pid 為欲等待的子進(jìn)程識(shí)別碼,其他數(shù)值意義如下:pidv-1 等待進(jìn)程組識(shí)別碼為 pid絕對(duì)值的任何子進(jìn)程。歡迎共閱pid=-1等待任何子進(jìn)程,相當(dāng)于 wait()。pid=O 等待進(jìn)程組識(shí)別碼與目前進(jìn)程相同的任何子進(jìn)程。pid0 等待任何子進(jìn)程識(shí)別碼為pid的子進(jìn)程。參數(shù) options 提供了一些額外的選項(xiàng)來(lái)控制waitpid ,參數(shù) option 可以為0 或可以用|運(yùn)算符把它們連接起來(lái)使用。2、實(shí)驗(yàn)調(diào)試(1) 實(shí)驗(yàn)一調(diào)試剛開(kāi)始在寫(xiě)兩個(gè) fork()程序時(shí),是將兩個(gè) fork()函數(shù)寫(xiě)在一起,如果是這 樣的話,第二次調(diào)用 fork

8、()語(yǔ)句時(shí)就可能不滿足實(shí)驗(yàn)的要求了,因?yàn)楦缸?進(jìn)程的執(zhí)行順序是任意的,在第二次調(diào)用 fork()函數(shù)時(shí),可能是第一次調(diào) 用產(chǎn)生的子進(jìn)程在調(diào)用這個(gè) fork()函數(shù),就會(huì)返回 0 值,不符合實(shí)驗(yàn)要求創(chuàng) 建兩個(gè)子進(jìn)程的條件,因此應(yīng)在確定當(dāng)前進(jìn)程時(shí)父進(jìn)程時(shí)才調(diào)用fork()語(yǔ)句創(chuàng)建第二個(gè)子進(jìn)程。(2) 實(shí)驗(yàn)二調(diào)試創(chuàng)建子進(jìn)程后,調(diào)用execl()將參數(shù)中指定的新進(jìn)程代替原有的進(jìn)程,若能夠成功替換該進(jìn)程就不會(huì)執(zhí)行該函數(shù)后面的exit(O),轉(zhuǎn)向執(zhí)行新進(jìn)程,待所有的子進(jìn)程執(zhí)行完畢后,就會(huì)轉(zhuǎn)向執(zhí)行 waitpid()函數(shù),再返回子進(jìn)程的識(shí)別碼,并 輸出;若沒(méi)有替換成功就會(huì)執(zhí)行execl()后面的語(yǔ)句 exi

9、t(O),終止當(dāng)前的子進(jìn)程,再轉(zhuǎn)向執(zhí)行 waitpid()語(yǔ)句。備注:實(shí)驗(yàn)調(diào)試過(guò)程中未能將調(diào)試結(jié)果截圖是本次實(shí)驗(yàn)的一大敗筆。下次會(huì)注意的。五、 實(shí)驗(yàn)結(jié)果I六、 實(shí)驗(yàn)源程序/*實(shí)驗(yàn)二程序*/#i nclude #i nclude #i nclude int main()pid_t pid1,pid2;/*先創(chuàng)建一個(gè)子進(jìn)程*/pid 1=fork();if (pid10)/*pid1 沒(méi)創(chuàng)建子進(jìn)程成功*/printf( fail to fork.n );exit(1);else if (pid1 = 0)printf( child,pid is : %un ,getpid();else歡迎共閱pr

10、intf(pare nt,pid is :%un,getpid();/*若是父進(jìn)程,則再新創(chuàng)建其子進(jìn)程*/pid2=fork();if (pid20)printf( fail to fork.n );exit(1); else if (pid2 = 0)printf( child,pid is : %un ,getpid(); elseprintf( parent,pid is :%un,getpid() );return 0;/*實(shí)驗(yàn)二程序*/#i nclude #in clude #i nclude #i nclude int main()pid_t pid;int result;/*創(chuàng)建子進(jìn)程*/pid = fork();if (pid 0)printf( fork error );else if (pid = 0)/*若是子進(jìn)程*/printf( new program.n);/*替換當(dāng)前的進(jìn)程*/execl( /root/fork.out , fork.out ,0);/*若沒(méi)有替換成功,終止該子進(jìn)程*/exit(0);else /*若子進(jìn)程全部執(zhí)行結(jié)束,*/*則返回子進(jìn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論