實(shí)驗(yàn)三進(jìn)程的創(chuàng)建和簡(jiǎn)單控制學(xué)生_第1頁(yè)
實(shí)驗(yàn)三進(jìn)程的創(chuàng)建和簡(jiǎn)單控制學(xué)生_第2頁(yè)
實(shí)驗(yàn)三進(jìn)程的創(chuàng)建和簡(jiǎn)單控制學(xué)生_第3頁(yè)
實(shí)驗(yàn)三進(jìn)程的創(chuàng)建和簡(jiǎn)單控制學(xué)生_第4頁(yè)
實(shí)驗(yàn)三進(jìn)程的創(chuàng)建和簡(jiǎn)單控制學(xué)生_第5頁(yè)
已閱讀5頁(yè),還剩14頁(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、實(shí)驗(yàn)三 進(jìn)程的創(chuàng)建和簡(jiǎn)單控制實(shí)驗(yàn)?zāi)康模?. 掌握進(jìn)程的概念和進(jìn)程的狀態(tài),對(duì)進(jìn)程有感性的認(rèn)識(shí);2. 掌握進(jìn)程創(chuàng)建方法;3. 認(rèn)識(shí)進(jìn)程的并發(fā)執(zhí)行,了解進(jìn)程族之間各種標(biāo)識(shí)及其存在的關(guān)系;4. 熟悉進(jìn)程的創(chuàng)建、阻塞、喚醒、撤銷(xiāo)等控制方法。實(shí)驗(yàn)內(nèi)容:1. 了解有關(guān)Linux進(jìn)程的屬性和進(jìn)程的層次結(jié)構(gòu);2. 學(xué)習(xí)有關(guān)Linux的前臺(tái)和后臺(tái)進(jìn)程;3. 學(xué)習(xí)有關(guān)Linux命令的順序執(zhí)行和并發(fā)執(zhí)行;4. 學(xué)習(xí)有關(guān)掛起和終止進(jìn)程;5. 了解并發(fā)程序的不可確定性,進(jìn)行簡(jiǎn)單并發(fā)程序設(shè)計(jì)。實(shí)驗(yàn)步驟:(一)Shell下的進(jìn)程控制1. 進(jìn)入Linux系統(tǒng)。2. 用ps查看進(jìn)程。a) linux的ps命令是用來(lái)監(jiān)視系統(tǒng)進(jìn)程和

2、資源使用情況的命令,可顯示瞬間進(jìn)程的動(dòng)態(tài)。b) ps 的參數(shù)非常多,常用的參數(shù)有:i. -A 列出所有的進(jìn)程;ii. -w 顯示加寬可以顯示較多的信息;iii. -au 顯示較詳細(xì)的信息;iv. -aux 顯示所有包含其他使用者的進(jìn)程。3. 用kill終止某些進(jìn)程。a) kill命令通過(guò)向進(jìn)程發(fā)送指定的信號(hào)來(lái)結(jié)束進(jìn)程。b) 先使用ps查到進(jìn)程號(hào),再使用kill殺出進(jìn)程。4. 用pstree命令顯示系統(tǒng)中進(jìn)程層次結(jié)構(gòu)。a) pstree指令用ASCII字符顯示樹(shù)狀結(jié)構(gòu),清楚地表達(dá)進(jìn)程間的相互關(guān)系。b) 語(yǔ)法格式 pstree -acGhlnpuUV-H <程序識(shí)別碼><程序識(shí)別

3、碼>/<用戶名稱(chēng)>(二)Linux簡(jiǎn)單進(jìn)程編程1. 理解系統(tǒng)調(diào)用fork()的使用。a) fork()會(huì)產(chǎn)生一個(gè)與父程序相同的子程序,唯一不同之處在于其進(jìn)程號(hào),如圖 1所示。圖 1 系統(tǒng)調(diào)用fork()b) 編輯下面的程序,要求實(shí)現(xiàn)父進(jìn)程產(chǎn)生兩個(gè)子進(jìn)程,父進(jìn)程顯示字符“a”、兩個(gè)子進(jìn)程,分別顯示字符“b”、“c” ,如圖 2所示。#include<stdio.h>main( )int p1,p2;while (p1=fork()=-1); /*父進(jìn)程創(chuàng)建第一個(gè)進(jìn)程,直到成功*/if(p1=0) /*0返回給子進(jìn)程 1*/putchar('b');/

4、*P1的處理過(guò)程*/ else /*正數(shù)返回給父進(jìn)程(子進(jìn)程號(hào))*/while (p2=fork()=-1); /*父進(jìn)程創(chuàng)建第二個(gè)進(jìn)程,直到成功*/if(p2=0) /*0返回給子進(jìn)程2*/putchar('c');/*P2的處理過(guò)程*/ elseputchar('a');/*P2創(chuàng)建完成后,父進(jìn)程的處理過(guò)程*/ 圖 2系統(tǒng)調(diào)用 fork()的使用示例一思考:i. 編譯連接通過(guò)后,多次運(yùn)行程序,觀察進(jìn)程并發(fā)執(zhí)行結(jié)果,并分析原因。原因:當(dāng)程序并發(fā)執(zhí)行時(shí),系統(tǒng)處于一個(gè)復(fù)雜的動(dòng)態(tài)組合狀態(tài),各程序執(zhí)行的相對(duì)速度不確定,這使得這些程序多次并發(fā)執(zhí)行得到的結(jié)果不同,調(diào)度、執(zhí)

5、行的順序由系統(tǒng)決定。ii. 刪除語(yǔ)句,觀察輸出的內(nèi)容,體會(huì)fork的使用。提示:編譯和運(yùn)行該程序,分析結(jié)果出現(xiàn)兩種輸出的原因。刪除語(yǔ)句后:思考的問(wèn)題:1. 運(yùn)行命令為什么是“./command”?將源文件保存為以.c為后綴名的文件,開(kāi)始進(jìn)行編譯$gcc -o XXX XXX.c 編譯成功完成后,在當(dāng)前路徑下,生成一個(gè)名為XXX的文件然后執(zhí)行 $./XXX 程序得以運(yùn)行2. . 和 . 什么含義?.表示當(dāng)前目錄,.表示上級(jí)目錄,即父目錄3. shell 提示為什么不換行?因?yàn)樵谳敵稣Z(yǔ)句中沒(méi)有/n換行符。4. 輸出字母為什么和提示交錯(cuò)?b,a,shell,c四個(gè)進(jìn)程并發(fā)執(zhí)行,執(zhí)行先后順序由系統(tǒng)調(diào)度

6、決定。所以當(dāng)shell調(diào)度在c進(jìn)程前時(shí),會(huì)出現(xiàn)輸出字母和提示交錯(cuò)的現(xiàn)象。5. 管道什么含義?管道符,可以認(rèn)為它是一根水管,連接輸入端和輸出端。a | b其中,| 就是管道符,將輸入端 a命令產(chǎn)生的數(shù)據(jù)傳給輸出端的b命令來(lái)處理6. ./f1|pstree|grep f1什么含義?將./f1產(chǎn)生的數(shù)據(jù)傳給pstree來(lái)處理,經(jīng)過(guò)pstree處理后的數(shù)據(jù)再傳給grep f1來(lái)處理在運(yùn)行f1文件的進(jìn)程的樹(shù)結(jié)構(gòu)中查找f1(?)7. 6中組合命令為什么沒(méi)有輸出?(?)8. 如果想保留6中的./f1的輸出內(nèi)容,該如何操作?進(jìn)行重定向操作9. ./f1 運(yùn)行結(jié)果為什么不一樣?每種結(jié)果的產(chǎn)生原因。有a,b,c三

7、個(gè)并發(fā)進(jìn)程,調(diào)度順序由系統(tǒng)決定bcabacabc10. ./f1|pstree|grep f1運(yùn)行結(jié)果為什么不一樣?截圖中四種結(jié)果的產(chǎn)生原因。由于并發(fā)進(jìn)程的調(diào)度順序是由系統(tǒng)決定的,并且pstree顯示的是一剎那的進(jìn)程,進(jìn)程調(diào)度又是動(dòng)態(tài)的。四種結(jié)果:無(wú)結(jié)果:可能三個(gè)進(jìn)程調(diào)度已經(jīng)結(jié)束或者還未開(kāi)始調(diào)度:父進(jìn)程已經(jīng)結(jié)束,兩個(gè)子進(jìn)程還在運(yùn)行:父進(jìn)程開(kāi)始運(yùn)行,子進(jìn)程還未開(kāi)始調(diào)度:兩個(gè)子進(jìn)程還在運(yùn)行(?)注意:./f1 |pstree |grep f1命令之間有空格。pstree 還可以加上參數(shù),-up如:./f1 |pstree up |grep f1提示:用pstree觀察進(jìn)程的父子關(guān)系,其中第二次不是

8、錯(cuò)誤,而是捕捉的時(shí)機(jī),當(dāng)時(shí)父進(jìn)程已經(jīng)結(jié)束,兩個(gè)子進(jìn)程還在運(yùn)行。擴(kuò)展:修改代碼,產(chǎn)生祖孫三代的進(jìn)程。說(shuō)明:三個(gè)fe和bash都是進(jìn)程,彼此間也會(huì)產(chǎn)生影響。2. 將上述的輸出字符改為輸出較長(zhǎng)的字符串,如圖 3所示。#include<stdio.h>int main( )int p1,p2;while (p1=fork()= -1);/*父進(jìn)程創(chuàng)建第一個(gè)進(jìn)程,直到成功*/if(p1=0)/*0返回給子進(jìn)程 1*/printf("boyn");/*P1的處理過(guò)程*/else/*正數(shù)返回給父進(jìn)程(子進(jìn)程號(hào))*/while (p2=fork()=-1);/*父進(jìn)程創(chuàng)建第二個(gè)

9、進(jìn)程,直到成功*/if(p2 = 0) /*0返回給子進(jìn)程2*/printf("daughtern"); /*P2的處理過(guò)程*/elseprintf("parentn");/*P2創(chuàng)建完成后,父進(jìn)程的處理過(guò)程*/圖 3系統(tǒng)調(diào)用 fork()的使用示例二思考:i. 編譯連接通過(guò)后,多次運(yùn)行程序,觀察進(jìn)程并發(fā)執(zhí)行結(jié)果:執(zhí)行結(jié)果均為:ii. 如果多次運(yùn)行輸出內(nèi)容沒(méi)有變化,請(qǐng)分析原因:函數(shù)fork( )用來(lái)創(chuàng)建一個(gè)新的進(jìn)程,該進(jìn)程幾乎是當(dāng)前進(jìn)程的一個(gè)完全拷貝,所以多次運(yùn)行輸出內(nèi)容沒(méi)有變化iii. 并改寫(xiě)原程序,延長(zhǎng)每個(gè)進(jìn)程的執(zhí)行時(shí)間,再次觀察運(yùn)行情況。延長(zhǎng)執(zhí)行時(shí)

10、間后:輸出的時(shí)間間隔變長(zhǎng)3. (選作)將上述的輸出字符改為多條輸出語(yǔ)句,如圖 4所示。#include<stdio.h>main( )int p1,p2;int i;while (p1=fork()=-1); /*父進(jìn)程創(chuàng)建第一個(gè)進(jìn)程,直到成功*/if(p1=0) /*0返回給子進(jìn)程 1*/for( i =0; i < 1000; i+) /*P1的處理過(guò)程*/putchar('b'); else /*正數(shù)返回給父進(jìn)程(子進(jìn)程號(hào))*/while (p2=fork()=-1); /*父進(jìn)程創(chuàng)建第二個(gè)進(jìn)程,直到成功*/if(p2=0) /*0返回給子進(jìn)程2*/fo

11、r( i =0; i < 1000; i+)putchar('c'); /*P2的處理過(guò)程*/elsefor( i =0; i < 1000; i+)putchar('a'); /*P2創(chuàng)建完成后,父進(jìn)程的處理過(guò)程*/圖 4 系統(tǒng)調(diào)用 fork()的使用示例三思考:i. 編譯連接通過(guò)后,多次運(yùn)行程序,觀察進(jìn)程并發(fā)執(zhí)行結(jié)果:ii. 如果多次運(yùn)行輸出內(nèi)容沒(méi)有變化,請(qǐng)分析原因。并改寫(xiě)原程序,延長(zhǎng)每個(gè)進(jìn)程的執(zhí)行時(shí)間,再次觀察運(yùn)行情況。iii. 如果多次運(yùn)行輸出內(nèi)容發(fā)生變化,并分析原因。iv. 將進(jìn)程放在后臺(tái)運(yùn)行,用pstree觀察進(jìn)程的宗族關(guān)系。v. 系統(tǒng)創(chuàng)

12、建一個(gè)新進(jìn)程(使用系統(tǒng)調(diào)用fork)與讓系統(tǒng)執(zhí)行一個(gè)新程序(使用系統(tǒng)調(diào)用exec)有什么差異?4. 理解系統(tǒng)調(diào)用wait()、getpid()和getppid()的使用。程序代碼如圖5所示。#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>int main()char buf100;pid_

13、t cld_pid;int fd;if(fd=open("temp",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU)=-1)printf("open error%d",errno);exit(1);strcpy(buf,"This is parent process writen");if(cld_pid=fork()=0) /*這里是子進(jìn)程執(zhí)行的代碼*/strcpy(buf,"This is child process writen");printf("This is child pro

14、cessn");sleep(1);printf("My PID (child) is%dn",getpid(); /*打印出本進(jìn)程的ID*/sleep(1); printf("My parent PID is %dn",getppid(); /*打印出父進(jìn)程的ID*/sleep(1);write(fd,buf,strlen(buf);close(fd);exit(0);else /*這里是父進(jìn)程執(zhí)行的代碼*/wait(0); /*如果此處沒(méi)有這一句會(huì)如何?*/printf("This is parent processn")

15、;sleep(1);printf("My PID (parent) is %dn",getpid(); /*打印出本進(jìn)程的ID*/sleep(1);printf("My child PID is %dn",cld_pid); /*打印出子進(jìn)程的ID*/sleep(1);write(fd,buf,strlen(buf);close(fd);return 0;圖5 系統(tǒng)調(diào)用wait()的使用思考:i. 編譯連接通過(guò)后,多次運(yùn)行程序,觀察進(jìn)程并發(fā)執(zhí)行結(jié)果:多次執(zhí)行:ii. 語(yǔ)句sleep(1);起什么作用?刪除所有sleep(1);語(yǔ)句,并觀察運(yùn)行結(jié)果;讓函數(shù)

16、滯留1秒。iii. 刪除wait(0);語(yǔ)句,并觀察運(yùn)行結(jié)果,并請(qǐng)分析兩次結(jié)果不同的原因,理解wait的作用。Wait的作用:wait函數(shù)用于使父進(jìn)程阻塞,直到一個(gè)子進(jìn)程結(jié)束兩次結(jié)果不同的原因:wait(0)一般是父進(jìn)程用來(lái)等待子進(jìn)程用的,用來(lái)防止子進(jìn)程成為僵尸進(jìn)程,0表示父進(jìn)程不關(guān)心子進(jìn)程的終止?fàn)顟B(tài)。實(shí)現(xiàn)父子進(jìn)程的同步。5. (不做)編寫(xiě)程序創(chuàng)建子進(jìn)程。父子進(jìn)程分別打印自己和父進(jìn)程的進(jìn)程ID,要求每3秒鐘打印系統(tǒng)進(jìn)程信息,重復(fù)5次后退出。父進(jìn)程待子進(jìn)程結(jié)束后退出。提示:i. 用系統(tǒng)調(diào)用getpid和getppid獲取進(jìn)程ID;ii. 用系統(tǒng)調(diào)用fork進(jìn)程創(chuàng)建;iii. 用系統(tǒng)調(diào)用wait控制父子進(jìn)程同步;iv. 用庫(kù)函數(shù)system實(shí)現(xiàn)在一個(gè)進(jìn)程內(nèi)部運(yùn)行另一個(gè)進(jìn)程,即創(chuàng)建一個(gè)新進(jìn)程;v. Shell命令/bin/ps作為system的字符串參數(shù),實(shí)現(xiàn)打印系統(tǒng)進(jìn)程信息。擴(kuò)充:關(guān)于父子進(jìn)程各自又再生成子進(jìn)程的例子。#include <unistd.h>#include <stdio.h>#include <sys/types.h>main() pid_t a_pid,b_pid; if(a_pid=fork()<0)

溫馨提示

  • 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)論