資源描述:
《操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實(shí)驗(yàn)四:進(jìn)程的管道通信?實(shí)驗(yàn)題目進(jìn)程的管道通信?實(shí)驗(yàn)?zāi)康募由顚?duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。學(xué)習(xí)進(jìn)程創(chuàng)建的過程,進(jìn)一步認(rèn)識(shí)進(jìn)程并發(fā)執(zhí)行的實(shí)質(zhì)。分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法。學(xué)習(xí)解決進(jìn)程同步的方法。掌握Linux系統(tǒng)中進(jìn)程間通過管道通信的具體實(shí)現(xiàn)?實(shí)驗(yàn)內(nèi)容使用系統(tǒng)調(diào)用pipe()建立一條管道,系統(tǒng)調(diào)用fork()分別創(chuàng)建兩個(gè)子進(jìn)程,它們分別向管道寫一句話,如:
Childprocess1issendingamessage!
Childprocess2issendingamessage!
父進(jìn)程分別從管道讀出來自兩個(gè)子進(jìn)程的信息,顯示在屏幕上。
當(dāng)然,僅僅通過
2、屏幕上輸出這兩句話還不能說明實(shí)現(xiàn)了進(jìn)程的管道通信,為了能夠更好的證明和顯示出進(jìn)程的同步互斥和通信,在其中要加入必要的跟蹤條件,如一定的輸出語句等,來反映程序的并發(fā)執(zhí)行情況?實(shí)驗(yàn)要求這是一個(gè)設(shè)計(jì)型實(shí)驗(yàn),要求自行、獨(dú)立編制程序。兩個(gè)子進(jìn)程要并發(fā)執(zhí)行。實(shí)現(xiàn)管道的互斥使用。當(dāng)一個(gè)子進(jìn)程正在對(duì)管道進(jìn)行寫操作時(shí),另一個(gè)欲寫入管道的子進(jìn)程必須等待。使用系統(tǒng)調(diào)用lockf(fd[1],1,0)實(shí)現(xiàn)對(duì)管道的加鎖操作,用lockf(fd[1],0,0)解除對(duì)管道的鎖定。實(shí)現(xiàn)父子進(jìn)程的同步,當(dāng)父進(jìn)程試圖從一空管道中讀取數(shù)據(jù)時(shí),便進(jìn)入等待狀態(tài),直到子進(jìn)程將數(shù)據(jù)寫入管道返回后,才將其喚醒。為了清楚的反應(yīng)進(jìn)程
3、的同步,在子進(jìn)程完成相應(yīng)的操作后,調(diào)用sleep()函數(shù)睡眠一段時(shí)間(程序中定為3s)。父進(jìn)程先執(zhí)行wait()函數(shù),當(dāng)有子進(jìn)程執(zhí)行完畢后,會(huì)得到子進(jìn)程的返回結(jié)果并清理子進(jìn)程。若子進(jìn)程沒執(zhí)行完,父進(jìn)程一直執(zhí)行wait()進(jìn)行監(jiān)聽,知道有一個(gè)子進(jìn)程執(zhí)行完成為僵尸進(jìn)程。?程序中用到的系統(tǒng)調(diào)用因?yàn)槌绦驎r(shí)在linux系統(tǒng)上進(jìn)行編寫的,所以其中要利用到相關(guān)的linux提供的系統(tǒng)調(diào)用。所用到的系統(tǒng)調(diào)用包含在如下頭文件中。#include#include#include#include#include4、dio.h>#includefork()用于創(chuàng)一個(gè)子進(jìn)程。
格式:intfork();
返回值:在子進(jìn)程中返回0;在父進(jìn)程中返回所創(chuàng)建的子進(jìn)程的ID值;當(dāng)返回-1時(shí),創(chuàng)建失敗。
wait()常用來控制父進(jìn)程與子進(jìn)程的同步。
在父進(jìn)程中調(diào)用wait(),則父進(jìn)程被阻塞,進(jìn)入等待隊(duì)列,等待子進(jìn)程結(jié)束。當(dāng)子進(jìn)程結(jié)束時(shí),父進(jìn)程從wait()返回繼續(xù)執(zhí)行原來的程序。
返回值:大于0時(shí),為子進(jìn)程的ID值;等于-1時(shí),調(diào)用失敗。
exit()是進(jìn)程結(jié)束時(shí)最常調(diào)用的。
格式:voidexit(intstatus);其中,status為進(jìn)程結(jié)束狀態(tài)。
pipe()用于創(chuàng)建一個(gè)管道
5、格式:pipe(intfd);
其中fd是一個(gè)由兩個(gè)數(shù)組元素fd[0]和fd[1]組成的整型
數(shù)組,fd[0]是管道的讀端口,用于從管道讀出數(shù)據(jù),fd[1]是管道的寫端口,用于向管道寫入數(shù)據(jù)。
返回值:0調(diào)用成功;-1調(diào)用失敗。
sleep()使調(diào)用進(jìn)程睡眠若干時(shí)間,之后喚醒。
格式:sleep(intt);其中t為睡眠時(shí)間。
lockf()用于對(duì)互斥資源加鎖和解鎖。在本實(shí)驗(yàn)中該調(diào)用的格式為:
lockf(fd[1],1,0);/*表示對(duì)管道的寫入端口加鎖。
lockf(fd[1],0,0);/*表示對(duì)管道的寫入端口解鎖。
write(fd[1],String,Length)將字符
6、串String的內(nèi)容寫入管道的寫入口。
read(fd[0],String,Length)從管道的讀入口讀出信息放入字符串String中。
?程序流程圖程序流程簡(jiǎn)述父進(jìn)程:創(chuàng)建管道;
創(chuàng)建子進(jìn)程1;
創(chuàng)建子進(jìn)程2;
等待從管道中先后讀出兩個(gè)子進(jìn)程寫入的信息,并顯示在屏幕上;
退出。子進(jìn)程:將管道的寫入口加鎖;
將信息“Childprocessnissendingmessage!”輸入到變量OutPipe中,n=1,2;
將OutPipe中信息寫入管道;
使自己進(jìn)入睡眠狀態(tài),另一進(jìn)程執(zhí)行;
從睡眠狀態(tài)返回,將管道的寫入口解鎖;
退出。
流程圖?程序源代碼?/*OS_3.c*/?#i
7、nclude?#include?#include?#include?#include?#include?intmain()?{?pid_tpc1,pc2,pr1,pr2;?intfd[2];?charbuf1[50],buf2[50],s[50];?pipe(fd);/*創(chuàng)建管道*/?pc1=fork();/*創(chuàng)建進(jìn)程*/?if(pc1<0)/