操作系統(tǒng)B2-上機(jī)實驗-進(jìn)程_第1頁
操作系統(tǒng)B2-上機(jī)實驗-進(jìn)程_第2頁
操作系統(tǒng)B2-上機(jī)實驗-進(jìn)程_第3頁
操作系統(tǒng)B2-上機(jī)實驗-進(jìn)程_第4頁
操作系統(tǒng)B2-上機(jī)實驗-進(jìn)程_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗二linux進(jìn)程實驗姓名:段葉葉 班級:信息1302學(xué)號:07131052地點:東區(qū)實驗室ff109時間:2014年10月13日星期一成績:一、實驗內(nèi)容1. 創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用fork ();2. 創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用vfork ();3. 執(zhí)行新程序的系統(tǒng)調(diào)用exec ();4. 等待進(jìn)程結(jié)束的系統(tǒng)調(diào)用wait ()或waitpid ()。前三題必做,最后一題選做。二、實驗?zāi)康氖煜みM(jìn)程的系統(tǒng)調(diào)用。三、實驗環(huán)境登陸linux虛擬機(jī),進(jìn)入linux shell,提示符為$,表示普通用廣提示符。四、實驗題目1. 【題目i:編寫程序forkgrandchild.c,用來創(chuàng)建孫子進(jìn)程?!疽蟆浚涸谧x

2、懂程序forktestx的基礎(chǔ)上,編寫程序forkgrandchild.c(forkgrandchild.c 創(chuàng)建狂用廣1名(如 wm)目錄下的 process 目錄下),所創(chuàng)建的程序forkgrandchild.c可實現(xiàn)創(chuàng)建孫子進(jìn)程,并顯示孫子 進(jìn)程的pid,其父進(jìn)程的pid,forkgrandchild.c要求可讀性好,用廣界面友好?!绢A(yù)備知識】:1) linux進(jìn)程狀態(tài)運行狀態(tài):程序正在運行或在運行隊列中等待運行??芍袛嗟却隣顟B(tài):進(jìn)程正在等待某個事件完成,等待過程可被信號或定時器 喚醒。不可中斷等待狀態(tài):進(jìn)程正在等待某個事件完成,不可被信號或定時器喚醒, 必須等待事件的發(fā)生,才可喚醒。僵

3、死狀態(tài):進(jìn)程己終止,但進(jìn)程描述符依然存在,直到父進(jìn)程調(diào)動wait()函 數(shù)后釋放。停止?fàn)顟B(tài):進(jìn)程因收到sigstop sigstp sigtin sigtou信號后停止運行或該進(jìn)程正在被跟蹤(調(diào)式程序時)。2)ps命令 ps命令可查看進(jìn)程的當(dāng)前狀態(tài)。*如ps aux (相關(guān)命令參數(shù)自學(xué))對ps命令結(jié)果字符的解釋< (高優(yōu)先級進(jìn)程)、n (低優(yōu)先級進(jìn)程)、l (|aj存鎖頁,即頁不可被換出內(nèi)存)、s (該進(jìn)程為會話首進(jìn)程)、1 (多線程進(jìn)程)、+ (進(jìn)程位于前臺進(jìn)程組)、r (運行狀態(tài))、z (僵死狀態(tài))、d (不可中斷等待狀態(tài))、s (可中斷等待狀態(tài))、t (停止?fàn)顟B(tài))。3)fork (

4、)函數(shù)fork ()是創(chuàng)建一個新進(jìn)程的唯一方法,子進(jìn)程可以繼承其父進(jìn)程幾乎所有 的資源。在命令行t使用man 2 fork可獲得該函數(shù)的函數(shù)聲明。fork ()有兩個 返回值。成功調(diào)用fork后,當(dāng)前進(jìn)程實際上己經(jīng)分裂為兩個進(jìn)程,一個是原來 的父進(jìn)程,男一個是剛剛創(chuàng)建的子進(jìn)程。父子進(jìn)程在調(diào)用fork地方分開,一個 是父進(jìn)程調(diào)用fork的返回值,返回值為剛剛創(chuàng)建的子進(jìn)程的pid;另一個是子進(jìn) 程中fork函數(shù)的返回值,為0。fork返回兩次的前提是進(jìn)程創(chuàng)建成功,若失敗返 回為-1。用返回值可區(qū)分父子進(jìn)程。fork之后是父還是子進(jìn)程先運行是不確定的,這取決于內(nèi)核所使用的調(diào)度算 法,一般是交替執(zhí)行,

5、使進(jìn)程享有同等執(zhí)行權(quán)。forktest.c 源代碼#include <stdio.h>#include <sys/types.h>#include <unistd.h> int main(void)pid_t pid;printffprocesscreation studyn);pid=fork();switch(pid)case 0 :printffchild process is running,curpid is %d,parentpid is %dn",pid,getppid(); break;case -1:printf(nprocess

6、 creation failedn); break;default:printf(nparent process is running,childpid is %d,parentpid is %dn",pid,getpid(); break;exit(0);【問題】:1) 解釋 stdio.h、unistd.h、sys/types.h 頭文件的作用?2) getpid()、getppid()、fork()的功能是什么?3) 寫出 forkgrandchild.c 的源代碼。(1) a. stdio. h頭文件的作用是:就是指“standard input&output&quo

7、t;意思 就是說標(biāo)準(zhǔn)輸入輸出頭文件。所以,用到標(biāo)準(zhǔn)輸入輸出函數(shù)時,就要 調(diào)用這個頭文件!原程序為:stdio. h;b. nuistd. h頭文件的作用是:是1 inux/unix的系統(tǒng)調(diào)用,包含了許多unix系統(tǒng)服務(wù)的函數(shù)原型,例如read(), writeo和getpid()函數(shù);c. sys/types. h頭文件的作用是:在應(yīng)用程序源文件中包含 sys/types.h以訪問一lp64和_ilp32的定義。此頭文件還包含 適當(dāng)時應(yīng)使用的多個基2派生類型,尤其是以下類型更為重要: clock_t表示系統(tǒng)吋間(以吋鐘周期為單位)。dcv_t用于設(shè)備號;off_t用于文件大小和偏移量;ptrd

8、iff_t是一種帶符號整型,用于對兩個指針執(zhí)行減法運算后所得 的結(jié)果;size_t反映內(nèi)存中對象的大小(以字節(jié)為單位); ssize.t供返回字節(jié)計數(shù)或錯誤提示的函數(shù)使用; time_t以秒力単位計時;所有這些類型在ilp32編譯環(huán)境中保持為32位值,并會在lp64 編譯環(huán)境中增長為64位值。(2) getpaido的功能是:返冋調(diào)用進(jìn)程的標(biāo)識符; getppido的功能是:返回父進(jìn)程標(biāo)識;forko的功能是:創(chuàng)建一個與當(dāng)前進(jìn)程完全相同的拷貝。(3) forkgrandchild.c 的源代碼:include stdio. h>include unistd. h> ttinclud

9、e <syspes. h> int main (void)pid_t, pidl, pid2;printf (process creation study. n);pidl=fork();switch (pidl)case 0 :printf("child process is running,curpid is %d, parentpid is %dn,pid, getppido);pid2=fork(pidl); switch(pid2)case 0:printf("grandchild process is running, curpidis %d, pa

10、rentpid is %dn' pid, getppido);break;case -1:printf (process creation failedn); break;default:printf (parent process is running ,grandchildpid is %d, parentpid is %dn' pid , getpido);break;case -1:printf(process creation failedn); break;default:printf("parent process is running ,childpi

11、d is %d ,parentpid is %dn' pid ,getpido);break;exit (0);2. 【題hl diffork.c的創(chuàng)建 【要求】:上機(jī)實現(xiàn)下面diffork.c的運行,體會fork ()和vfork ()的區(qū)別。【預(yù)備知識】:1) fork ()和 vfork ()的區(qū)別 fork ()和vfork ()都是調(diào)用一次,返回值兩次。 fork ()創(chuàng)建一子進(jìn)程時,子進(jìn)程只是完全復(fù)制父進(jìn)程資源,這樣得到的子 進(jìn)程獨立于父進(jìn)程,具有良好的并發(fā)性,但開銷較大,有時是不需耍的,比 如fork 個進(jìn)程后,立即調(diào)用exec執(zhí)行另一個應(yīng)用程序,那么fork過程中 子進(jìn)

12、程對父進(jìn)程地址空間的復(fù)制將是一個多余的過程,而vfork ()創(chuàng)建的子進(jìn)程共享父進(jìn)程的地址空間,不拷貝父進(jìn)程的地址空間,這大大減少了系 統(tǒng)開銷。 vfork ()保證子進(jìn)程先運行,當(dāng)它調(diào)用exec ()或exit之后,父進(jìn)程方可能 被調(diào)度。diffork.c源代碼#include <stdio.h>#include <sys/types.h>#include <unistd.h> int globvar=5; int main(void)pid_t pid; int var=l,i;printf("fork is diffirent with vf

13、orkn");/* pid=fork();*/ pid=vfork();switch(pid)case 0: i=3;while(i>0)printf(”child process is runningnh);globvar+;var+;sleep(15);printffchild is globvar=%d,var=%dn",globvar,var); break; case 1:printf(parent creation failedn); exit(0); default: i=5;while(i0)printf(parent process is runni

14、ngn”);globvar+;var+;$leep(5);printf(parent is globvar=%d,var=%dn,globvar,var); exit(0);【注意】:將diffork.c中的sleep ()的參數(shù)增大些,開啟另一個終端,在該終端下輸入 psaux查看父子進(jìn)程的信息,特別是狀態(tài)信息?!窘Y(jié)果】:guest-nxnlc2ubuntu:-s vim dtffork-c guest-nxnlc2ubuntu:$ gcc -o dtffork dtffork>c difforkec:在函數(shù)main * 中:diffork_.c27:10£望告隱式聲明寫內(nèi)建

15、函數(shù)'exit不兼容默認(rèn)啟用 guest-nxnlczgubuntu>/diffork fork is dtffirent with vfork child process is running child process ts running child process ts running child is globvar=8tvar=4 parent process is running parent process is running parent process is running parent process ts running parent process t

16、s running parent ts globvar=13tvar=8295209guest-llxnitubuntu: -s3. 【題目i:執(zhí)行新程序的系統(tǒng)調(diào)用exec ()【要求】:上機(jī)實現(xiàn)下面processimage.c和execve.c的運行,體會執(zhí)行新程序的系統(tǒng)調(diào) 用?!绢A(yù)備知識l1) 使用fork或vfork創(chuàng)建子進(jìn)程后,子進(jìn)程通常會調(diào)用exec函數(shù)來執(zhí)行另 外一個程序,系統(tǒng)調(diào)用exec用于執(zhí)行一個可執(zhí)行程序以代替當(dāng)前進(jìn)程的 執(zhí)行映像。2) exec調(diào)用并沒有生成新進(jìn)程,一個進(jìn)程一旦調(diào)用exec函數(shù),它本身就死 亡丫。系統(tǒng)把代碼段替換成新的程序的代碼,廢棄原有的數(shù)據(jù)段和堆棧 段,

17、并為新進(jìn)程分配新的數(shù)據(jù)段和堆棧段,唯一保留是pid,s卩,對系統(tǒng) 而言,還是同一個進(jìn)程,不過執(zhí)行的已經(jīng)是另一個程序了。3) exec函數(shù)族有6種不同的調(diào)用形似,如execv ()、execve ()等,它們聲明在unistd.h中。processimage.c 源代碼#include <stdio.h>#include <sys/types.h>include <unistd.h>int main(int argc,char * argvj,char *environ)int i;printf("i am a process image!n);pr

18、intf(nmy pid=%d,parentpid=%dn,getpid(),getppid();printf("uid=%d,gid=%dn",getuid(),getgid();for(i=0;i<argc;i+)printf("argv%d:%sn",i,argvi);execve.c源代碼#include <stdio.h>#include <sys/types.h>include <unistd.h>int main(int argc,char *argvl,char *environ)pid_t pi

19、d; int stat_val;printf(nexec example!n”);pid=fork();switch(pid)case 1:perror(nprocess creation failedn); exit ; case 0:printf(child process is runningnf,); printf(hmy pid=%d,parentpid=%dnn,getpid(),gelppid(); printf(,'uid=%d,gid=%dn",getuid(),getgid(); execve(uproce$simage,argv,environ);pri

20、ntf(process never go to here!nh); exit(0); default:printf(parent process is runningn); break;wait(&stat_val);exit(0);【注意】:1) 理解帶參數(shù)的main ()函數(shù)。2) 在linux命令行下,使用man execve獲取該函數(shù)的幫助?!締栴}】:先編譯鏈接processimage.c,再編譯鏈接execve.c:斉看運行結(jié)果,結(jié) 果說明了什么?運行結(jié)果截圖見下頁parent process is running parent as alobvar=13var=829s2的

21、guest-nxnlc2ubuntu:-$ vtm processtngnage<c guest-nxnlc2ubuntu:-$ gcc -o processtngnage processtngnage.c guest-nxnlc20ubuntu:-$ ./processtngnageargvioj:/processtngnage guest-nxnlc2gubuntu:$ lji an a process image! ny p&d-2395lparentpid2230 1(1=114,9=125jagv0:/processingoo© guest-nxn1c2ubu

22、ntu: *screi23scr z3guest-nxnlc2ubuntu:-$ vxn exe.c guest-nxnlc2ubuntu:-$ gcc -o exe exe.c exe.c:在函數(shù)saw中:exe.c:14:10:蒈告:隱式聲明與內(nèi)建函數(shù)'exit'不兼容默認(rèn)啟用 exe.c:27:4:習(xí)告:隱式聲明與內(nèi)建函數(shù)extt'不兼容默認(rèn)啟用 u§t-nxhr(jbuhiut-$ .exec example! parent process ts running child process ts running ny pid=2558,parentpt

23、d=2557 uld=114,gid=125 process never go to here!etrnmxnic 2ubuntu:- >4. 【題目】:等待進(jìn)程結(jié)束的系統(tǒng)調(diào)用wait ()或waitpid ()?!疽蟆浚荷蠙C(jī)實現(xiàn)下面wait.c的運行,體會等待進(jìn)程結(jié)束wait ()系統(tǒng)調(diào)用。【預(yù)備知識】:子進(jìn)程先于父進(jìn)程終止,而父進(jìn)程又沒有調(diào)用wait函數(shù)等待子進(jìn)程結(jié)束,子進(jìn)程進(jìn)入僵死狀態(tài),并會一直保持下去除非重啟。子進(jìn)程進(jìn)入僵死狀態(tài)時,內(nèi)核只保存該進(jìn)程的一些必耍信息以備父進(jìn)程所需。此時子進(jìn)程始終占用著資源,同時也減少了系統(tǒng)可創(chuàng)建的最大進(jìn)程數(shù)。如果子進(jìn)程先于父進(jìn)程終止,且父進(jìn)程調(diào)用了

24、 wait或waitpid函數(shù),則父進(jìn)程會等待子進(jìn)程結(jié)束,就不會使子進(jìn)程變?yōu)榻┦M(jìn)程。wait.c源代碼#include <unistd.h>#include <stdio.h>#include <sys/wait-h>#include <sys/types.h> int main()pid_t pid; char *msg; int k;int exit_code;printffstudy how to get exit codenn);pid=fork();switch(pid)case 0:msg=child process is running”; k=5;exit_code=37; break; case -1:perror ("process creation failednn); exit ; default:exit_code=0;break;)if(pid!=0)int stat_val;pid_t child_pid;cbild_pid=wait(&stat_val);printf(child process has exited,pid=%dn,child_pid); if (wifexited(stat_val)printf("child exited with code %d

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論