




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)一、進(jìn)程控制實(shí)驗(yàn)1.1實(shí)驗(yàn)?zāi)康募由顚?duì)于進(jìn)程并發(fā)執(zhí)行概念的理解。實(shí)踐并發(fā)進(jìn)程的創(chuàng)建和控制方法。觀察和體驗(yàn)進(jìn)程的動(dòng)態(tài)特性。進(jìn)一步理解進(jìn)程生命期期間創(chuàng)建、變換、撤銷狀態(tài)變換的過(guò)程。掌握進(jìn)程控制的方法,了解父子進(jìn)程間的控制和協(xié)作關(guān)系。練習(xí)Linux系統(tǒng)中進(jìn)程創(chuàng)建與控制有關(guān)的系統(tǒng)調(diào)用的編程和調(diào)試技術(shù)。1.2實(shí)驗(yàn)說(shuō)明1)與進(jìn)程創(chuàng)建、執(zhí)行有關(guān)的系統(tǒng)調(diào)用說(shuō)明進(jìn)程可以通過(guò)系統(tǒng)調(diào)用fork()創(chuàng)建子進(jìn)程并和其子進(jìn)程并發(fā)執(zhí)行子進(jìn)程初始的執(zhí)行映像是父進(jìn)程的一個(gè)復(fù)本子進(jìn)程可以通過(guò)exec()系統(tǒng)調(diào)用族裝入一個(gè)新的執(zhí)行程序。父進(jìn)程可以使用wait()或waitpid()系統(tǒng)調(diào)用等待子進(jìn)程的結(jié)束并負(fù)責(zé)收集和清理子進(jìn)程的
2、退出狀態(tài)。fork()系統(tǒng)調(diào)用語(yǔ)法:#in clude <uni std.h>pid_tfork(void);fork成功創(chuàng)建子進(jìn)程后將返回子進(jìn)程的進(jìn)程號(hào),不成功會(huì)返回-1.exec系統(tǒng)調(diào)用有一組6個(gè)函數(shù),其中示例實(shí)驗(yàn)中引用了execve系統(tǒng)調(diào)用語(yǔ)法:#in clude <uni std.h>int execve(c onst char *path, const char *argv,const char * en vp);path 要裝入的新的執(zhí)行文件的絕對(duì)路徑名字符串a(chǎn)rgv要傳遞給新執(zhí)行程序的完整的命令參數(shù)列表(可以為空).envp要傳遞給新執(zhí)行程序的完整的環(huán)境變
3、量參數(shù)列表(可以為空).用等。信號(hào)的名字都以SIG開頭,例如 SIGTERM、SIGHUP。可以使用 kill -I命調(diào)用進(jìn)程了。如果exec調(diào)用失敗,它會(huì)返回-1wait()系統(tǒng)調(diào)用語(yǔ)法:#in elude <sys/types.h>pid_t#i nclude <sys/wait.h>wait(i nt *status);pid_t waitpid(pid_t pid,i nt *status,i nt opti on);status 用 于保留子進(jìn)程的退出狀態(tài)pid可以為以下可能值:-1等待所有 PGID等于PID的絕對(duì)值的子進(jìn)程1等待所有子進(jìn)程0等待所有PGID
4、等于調(diào)用進(jìn)程的子進(jìn)程>0 等待PID等于pid的子進(jìn)程 option規(guī)定了調(diào)用waitpid進(jìn)程的行為:WNOHANG沒(méi)有子進(jìn)程時(shí)立即返回WUNTRACED沒(méi)有報(bào)告狀態(tài)的進(jìn)程時(shí)返回wait和waitpid執(zhí)行成功將返回終止的子進(jìn)程的進(jìn)程號(hào),不成功返回-1。getpid()系統(tǒng)調(diào)用語(yǔ)法:#in clude <sys/types.h>#in clude <uni std.h>pid_tgetpid(void);pid_t getppid(void);getpid返回當(dāng)前進(jìn)程的進(jìn)程號(hào),getppid返回當(dāng)前進(jìn)程父進(jìn)程的進(jìn)程號(hào)2)與進(jìn)程控制有關(guān)的系統(tǒng)調(diào)用說(shuō)明可以通過(guò)信號(hào)向
5、一個(gè)進(jìn)程發(fā)送消息以控制進(jìn)程的行為。信號(hào)是由中斷或異常事件引發(fā)的,如:鍵盤中斷、定時(shí)器中斷、非法內(nèi)存引令查看系統(tǒng)當(dāng)前的信號(hào)集合。信號(hào)可在任何時(shí)間發(fā)生,接收信號(hào)的進(jìn)程可以對(duì)接收到的信號(hào)采取3種處理措施之' .?忽略這個(gè)信號(hào)?執(zhí)行系統(tǒng)默認(rèn)的處理?捕捉這個(gè)信號(hào)做自定義的處理信號(hào)從產(chǎn)生到被處理所經(jīng)過(guò)的過(guò)程:產(chǎn)生(generate)-> 掛起(pending)-> 派送(deliver)-部署(disposition)或忽略(igore)一個(gè)信號(hào)集合是一個(gè)C語(yǔ)言的sigset_t數(shù)據(jù)類型的對(duì)象,sigset_t數(shù)據(jù)類型定義在<signal.h>中。被一個(gè)進(jìn)程忽略的所有信號(hào)的
6、集合稱為一個(gè)信號(hào)掩碼(mask)。從程序中向一個(gè)進(jìn)程發(fā)送信號(hào)有兩種方法:調(diào)用shell的kill命令,調(diào)用kill系統(tǒng)調(diào)用函數(shù)。kill能夠發(fā)送除殺死一個(gè)進(jìn)程(SIGKILL、SIGTERM、SIGQUIT)之外的其他信號(hào),例如鍵盤中斷(Ctrl+C)信號(hào)SIGINT,進(jìn)程暫停(Ctrl+Z)信號(hào)SIGTSTP 等等。調(diào)用Pause函數(shù)會(huì)令調(diào)用進(jìn)程的執(zhí)行掛起直到一個(gè)任意信號(hào)到來(lái)后再繼續(xù)運(yùn)行。調(diào)用sleep函數(shù)會(huì)令調(diào)用進(jìn)程的執(zhí)行掛起睡眠指定的秒數(shù)或一個(gè)它可以響應(yīng)的信號(hào)到來(lái)后繼續(xù)執(zhí)行。每個(gè)進(jìn)程都能使用sig nal函數(shù)定義自己的信號(hào)處理函數(shù),捕捉并自行處理接收的除SIGSTOP和SIGKILL之外
7、的信號(hào)。以下是有關(guān)的系統(tǒng)調(diào)用的語(yǔ)法說(shuō)明。kill系統(tǒng)調(diào)用語(yǔ)法:#in elude <sys/types.h>#in elude <sig nal.h>int kill(pid_t pid, int sig);pid接收信號(hào)的進(jìn)程號(hào)sig nal要發(fā)送的信號(hào)kill發(fā)送成功返回接收者的進(jìn)程號(hào),失敗返回-1。pause系統(tǒng)調(diào)用語(yǔ)法:# in elude <uni std.h> intpause(void);pause掛起調(diào)用它的進(jìn)程直到有任何信號(hào)到達(dá)。調(diào)用進(jìn)程不自定義處理方法,則進(jìn)行信號(hào)的默認(rèn)處理。只有進(jìn)程自定義了信號(hào)處理方法捕獲并處理了一個(gè)信號(hào)后,pause才
8、會(huì)返回調(diào)進(jìn)程。pause總是返回-1,并設(shè)置系統(tǒng)變量errno為EINTR。sleep系統(tǒng)調(diào)用語(yǔ)法:#in clude <uni std.h>un sig ned int sleep( un sig ned int sec on ds);seco nds指定進(jìn)程睡眠的秒數(shù)如果指定的秒數(shù)到,sleep返回0。signal系統(tǒng)調(diào)用語(yǔ)法為:#in clude <sig nal.h> typedef void(*sigha ndler_t)(i nt);sigha ndler_t sig nal( int sig num, sigha ndler_t han dler);sig
9、 num要捕捉的信號(hào)han dler進(jìn)程中自定義的信號(hào)處理函數(shù)名signal調(diào)用成功會(huì)返回信號(hào)處理函數(shù)的返回值,不成功返回-1,并設(shè)置系統(tǒng)變量errno 為 SIG_ERR。1.3示例實(shí)驗(yàn)以下實(shí)驗(yàn)示例程序應(yīng)實(shí)現(xiàn)一個(gè)類似子shell子命令的功能,它可以從執(zhí)行程序中啟動(dòng)另一個(gè)新的子進(jìn)程并執(zhí)行一個(gè)新的命令和其并發(fā)執(zhí)行1)打開一終端命令行窗體,新建一個(gè)文件夾,在該文件夾中建立以下名為pctl.c的C語(yǔ)言程序:/* File name: pctl.c* copyright: (C) 2006 by zhanghonglie* Function:父子進(jìn)程的并發(fā)執(zhí)行*/#i nclude "pct
10、l.h"int main (i nt argc, char *argv) int i;int pid;/存放子進(jìn)程號(hào)int status; /存放子進(jìn)程返回狀態(tài) char *args="/bin/Is"," -a",NULL;/子進(jìn)程要缺省執(zhí)行的命令sig nal(SIGINT,(sigha ndler_t)sigcat);/注冊(cè)一個(gè)本進(jìn)程處理鍵盤中斷的函數(shù)pid=fork() ; / 建立子進(jìn)程 if(pid<0) / 建立子進(jìn)程失???prin tf("Create Process fail!n");exit(EXI
11、T_FAILURE);if(pid = 0) /子進(jìn)程執(zhí)行代碼段/報(bào)告父子進(jìn)程進(jìn)程號(hào)prin tf("I am Child process %dnMy father is %dn",getpid(),getppid();pause();暫停,等待鍵盤中斷信號(hào)喚醒子進(jìn)程被鍵盤中斷信號(hào)喚醒繼續(xù)執(zhí)行if(argv1 != NULL)printf("%d child will Running:n ",getpid(); /如果在命令行上輸入了子進(jìn)程要執(zhí)行的命令則執(zhí)行輸入的命令for(i=1; argvi != NULL; i+)prin tf("%s
12、”,argvi);prin tf("n");/裝入并執(zhí)行新的程序status = execve(argv1,&argv1,NULL); else如果在命令行上沒(méi)輸入子進(jìn)程要執(zhí)行的命令則執(zhí)行缺省的命令for(i=0; argsi != NULL; i+) prin tf("%s ",argsi);prin tf("n");/裝入并執(zhí)行新的程序status = execve(args0,args,NULL);else 父進(jìn)程執(zhí)行代碼段prin tf("nl am Pare nt process%dn",getp
13、id(); / 報(bào)告父進(jìn)程進(jìn)程號(hào)if(argv1 != NULL)如果在命令行上輸入了子進(jìn)程要執(zhí)行的命令則父進(jìn)程等待子進(jìn)程執(zhí)行結(jié)束printf("%dWaiting for child done.nn" ,pid );waitpid(pid,&status,0);等待子進(jìn)程結(jié)束prin tf("nMy child exit! status = %dnn",status); else/如果在命令行上沒(méi)輸入子進(jìn)程要執(zhí)行的命令/喚醒子進(jìn)程,與子進(jìn)程并發(fā)執(zhí)行不等待子進(jìn)程執(zhí)行結(jié)束,if(kill(pid,SIGINT) >= 0)prin tf(&q
14、uot;%d Wakeup %d child.n",getpid(),pid) ;prin tf("%d don't Wait forchild don e.nn ”,getpid(); return EXIT_SUCCESS;2)再建立以下名為pctl.h的C語(yǔ)言頭文件:#in clude <sys/types.h>#in clude <wait.h>#in clude <uni std.h>#in clude <sig nal.h>#i nclude <stdio.h>#i nclude <std
15、lib.h>/進(jìn)程自定義的鍵盤中斷信號(hào)處理函數(shù)typedef void (*sigha ndler_t) (in t); void sigcat() printf("%d Process continuen",getpid();3) 建立以下項(xiàng)目管理文件Makefilehead = pctl.h srcs = pctl.c objs = pctl.o opts =-g -call: pctlpctl:$(objs)gcc $(objs) -o pctl pctl.o:$(srcs) $(head)gcc $(opts) $(srcs) clean:rm pctl *.
16、o4)輸入make命令編譯連接生成可執(zhí)行的pctl程序$ g makegcc -g -c pctl.cgcc pctl.o -o pctl5) 執(zhí)行pctl程序(注意進(jìn)程號(hào)是動(dòng)態(tài)產(chǎn)生的,每次執(zhí)行都不相同)$ ./pctlI am Child process 4113My father is 4112I am Pare nt process 4112 Wakeup 4113 child.4112 don't Wait for child done.4113 Process continue4113 child will Ru nning:/bin/Is -a.Makefile pctl
17、pctl.c pctl.h pctl.o$以上程序的輸出說(shuō)明父進(jìn)程4112創(chuàng)建了一個(gè)子進(jìn)程4113,子進(jìn)程執(zhí)行被暫停。父進(jìn)程向子進(jìn)程發(fā)出鍵盤中斷信號(hào)喚醒子進(jìn)程并與子進(jìn)程并發(fā)執(zhí)行。父進(jìn)程并沒(méi)有等待子進(jìn)程的結(jié)束繼續(xù)執(zhí)行先行結(jié)束了(此時(shí)的子進(jìn)程成為了孤兒進(jìn)程,不會(huì)有父進(jìn)程為它清理退出狀態(tài)了)。而子進(jìn)程繼續(xù)執(zhí)行,它變成了列出當(dāng)前目錄所有文件名的命令ls -a。在完成了列出文件名命令之后,子進(jìn)程的執(zhí)行也結(jié)束了。此時(shí)子進(jìn)程的退出狀態(tài)將有初始化進(jìn)程為它清理。6)再次執(zhí)行帶有子進(jìn)程指定執(zhí)行命令的pctl程序:$ ./pctl /bin/ls -lI am Child process 4223My father
18、 is 4222I am Pare nt process 42224222 Waiting for child done.可以看到這一次子進(jìn)程仍然被掛起,而父進(jìn)程則在等待子進(jìn)程的完成。為了檢測(cè)父子進(jìn)pctl的進(jìn)程,它們的進(jìn)程號(hào)分別是4222和4223。程是否都在并發(fā)執(zhí)行,請(qǐng)輸入ctrl+z將當(dāng)前進(jìn)程放入后臺(tái)并輸入ps命令查看當(dāng)前系1+Stopped./pctl /bin/ls-l $ ps -lF SUID PIDPPIDC PRINI ADDR SZ WCHAN TTY TIMECMD0 S0408540830760-1413 waitpts/100:00:00bash0T042224085
19、0760-360 finishpts/100:00:00pctl1 T0422342220760-360 finishpts/100:00:00pctl0 R0423140850780 -1302 -pts/100:00:00ps統(tǒng)進(jìn)程信息,顯示如下:可以看到當(dāng)前系統(tǒng)中同時(shí)有兩個(gè)叫它們的狀態(tài)都為 一T說(shuō)明當(dāng)前都被掛起。4223的父進(jìn)程是4222,而4222的父進(jìn)程是4085,也就是bash-shell。為了讓pctl父子進(jìn)程繼續(xù)執(zhí)行,請(qǐng)輸入 fg命令讓pctl再次返回前臺(tái),顯示如下:$ fg./pctl /bin/ls -l現(xiàn)在pctl父子進(jìn)程從新返回前臺(tái)。我們可以通過(guò)鍵盤發(fā)鍵盤中斷信號(hào)來(lái)喚醒pctl父子進(jìn)程繼續(xù)執(zhí)行,輸入ctrl+c,將會(huì)顯示:4222 Process continue4223 Process continue4223 child will Ru nning: /bin/ls-l total 1708-rw-r-r- 1 root root 176 May 8 11:11 Makefile-rwxr-xr-x 1 root root 8095 May 8 14:08 pctl-rw-r-r- 1 root root 2
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沖壓件質(zhì)檢員崗位面試問(wèn)題及答案
- 消費(fèi)金融風(fēng)控建模師崗位面試問(wèn)題及答案
- 四川省成都石室天府2025年高一下化學(xué)期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 2025屆安徽省舒城龍河中學(xué)化學(xué)高二下期末聯(lián)考模擬試題含解析
- 吉林省長(zhǎng)春市“BEST合作體”2025屆化學(xué)高二下期末綜合測(cè)試試題含解析
- 2025屆廣州協(xié)和中學(xué)高二化學(xué)第二學(xué)期期末檢測(cè)模擬試題含解析
- 機(jī)械非標(biāo)造價(jià)管理辦法
- 區(qū)內(nèi)惡意挖人管理辦法
- 區(qū)縣撥付資金管理辦法
- 安全行為量化分析-洞察及研究
- 2024年漳州市常山開發(fā)區(qū)招聘筆試真題
- 2024年09月年中國(guó)農(nóng)業(yè)發(fā)展銀行江蘇省分行秋季校園招聘(86人)筆試歷年參考題庫(kù)附帶答案詳解
- 2025年江蘇省揚(yáng)州市中考作文4篇范文:“尊重”“誠(chéng)實(shí)”“創(chuàng)造性”“美好生活”
- 2025年輔警招聘考試試題庫(kù)含完整答案
- 2025年吉林省中考語(yǔ)文試卷及答案
- 2024-2025學(xué)年度天津鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握小墩Z(yǔ)文》真題附答案詳解(突破訓(xùn)練)
- 快遞行業(yè)市場(chǎng)發(fā)展分析及投資前景研究報(bào)告2025-2028版
- 2025年國(guó)情與形勢(shì)政策教育綱要
- 《基本樂(lè)理》師范與學(xué)前教育專業(yè)基本樂(lè)理相關(guān)知識(shí)全套教學(xué)課件
- 2025年安徽省中考物理試題(原卷版)
- 2025-2026年中國(guó)臺(tái)球產(chǎn)業(yè)消費(fèi)趨勢(shì)報(bào)告
評(píng)論
0/150
提交評(píng)論