操作系統實驗四_第1頁
操作系統實驗四_第2頁
操作系統實驗四_第3頁
操作系統實驗四_第4頁
操作系統實驗四_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.青 島 理 工 大 學課程實驗報告課程名稱操作系統班級軟件114實驗日期2013/10/28姓名李曉菲學號201107286實驗成績實驗名稱實驗4進程通信實驗目的及要求1、加深理解進程通信的方法與原理;2、掌握如何利用管道機制、消息緩沖隊列、共享存儲區機制進行進程間的通信。實驗環境Windows; Virtual Box; Ubuntu 11.10;Vi編輯器; GCC編譯器; Geany IDE;實驗內容1、了解系統調用pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功 能和實現過程。

2、2、編寫一C語言程序,使其用管道來實現父子進程間通信。子進程向父進程發送字符串“is sending a message to parent!”;父進程則從管道中讀出子進程發來的消息,并將其顯示到屏幕上,然后終止。3、運行該程序,觀察、記錄并簡單分析其運行結果。算法描述及實驗步驟算法描述及實驗步驟算法描述及實驗步驟1、pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()(1)pipe( )系統調用格式:pipe()參數定義int pipe();int 2;其中,1是寫入端,0是讀出端。該函數使用

3、頭文件如下:#include #inlcude #include 功能:建立一無名管道。管道建立后,寫進程將數據寫入文件1,讀進程從文件0中讀數據,從而實現讀/寫進程的管道通信。管道是一個共享資源,寫/寫進程、讀/寫進程應互斥使用管道。(2)msgget( )系統調用格式:int msgget(key_t key, int msgflg);功能:獲取與某個鍵關聯的消息隊列標識。消息隊列被建立的情況有兩種: (1)如果鍵的值是IPC_PRIVATE。 (2)或者鍵的值不是IPC_PRIVATE,并且鍵所對應的消息隊列不存在,同時標志中指定IPC_CREAT。該函數使用頭文件如下:#include

4、 #include #include (3、4)msgsnd( )和msgrcv( )系統調用格式int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);功能:在消息隊列上進行收發消息。為了發送消息,調用進程對消息隊列必須有寫權限。接收消息時必須有讀權限。該函數使用頭文件如下:#include #include #include (5)msgctl( )系統調用格式i

5、nt msgctl(int msqid, int cmd, struct msqid_ds *buf);功能:在指定的消息隊列上執行某種控制操作。該函數使用頭文件如下:#include #include #include (6)shmget( )功能:用于創建(或者獲取)一個由key鍵值指定的共享內存對象,返回該對象的系統標識符:shmid;系統調用格式:shmid=shmget(key,size,flag)該函數使用頭文件如下:#include#include#include(7)shmat( )功能:共享存儲區的附接。從邏輯上將一個共享存儲區附接到進程的虛擬地址空間上。用于建立調用進程與由

6、標識符shmid指定的共享內存對象之間的連接。系統調用格式:virtaddr=shmat(shmid,addr,flag)該函數使用頭文件如下:#include#include#include(8)shmdt( )功能:用于斷開調用進程與共享內存對象之間的連接,成功時返回0,失敗返回-1。系統調用格式:int shmdt(shmaddr)char *shmaddr;/*采用shmat函數的返回值*/(9)shmctl( )功能:共享存儲區的控制,對其狀態信息進行讀取和修改。用于對已創建的共享內存對象進行查詢、設置、刪除等操作。系統調用格式:shmctl(shmid,cmd,buf)該函數使用頭

7、文件如下:#include#include#include2、步驟:(1)定義進程變量 (2)定義兩個字符數組 (3)創建管道 (4)如果進程創建不成功,則空循環 (5)如果子進程創建成功,pid為進程號 (6)鎖定管道 (7)給Outpipe賦值 (8)向管道寫入數據 (9)等待讀進程讀出數據 (10)解除管道的鎖定 (11)結束進程等待子進程結束 (12)從管道中讀出數據 (13)顯示讀出的數據 (14)父進程結束 調試過程及實驗結果創建jincheng.c插入文字運行:運行后:總結總結(對實驗結果進行分析,問題回答,實驗心得體會及改進意見)雖然對pipe()、msgget()、msgsn

8、d()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和實現過程有所了解,但是運用還是不熟練,過去沒見過,所以運行了一個簡單的程序。利用管道機制、消息緩沖隊列、共享存儲區機制進行進程間的通信,加深了對其了解。(1)管道通信機制,同步的實現過程:當寫進程把一定數量的數據寫入pipe,便去睡眠等待,直到讀進程取走數據后,再把它喚醒。當讀進程讀一空pipe時,也應睡眠等待,直到寫進程將數據寫入管道后,才將之喚醒,從而實現進程的同步。管道通信的特點:A 管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;B. 只能用

9、于父子進程或者兄弟進程之間(具有親緣關系的進程);C.單獨構成一種獨立的文件系統:管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存在與內存中。D. 數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,并且每次都是從緩沖區的頭部讀出數據。管道適用于處理大量的同步操作問題。(2)消息隊列的特點:A.消息隊列機制增加了管理的負擔B.消息隊列通信機制非常快捷C.消息隊列機制是異步信息處理,不是實時的(3)共享存儲區通信:為了傳輸大量數據,在存儲區中劃出了一塊共享存儲區,

10、諸進程便可通過對共享存儲區中數據的讀或寫來實現通信。附錄(源程序清單)#include #include #include int pid; / 定義進程變量 main( ) int fd2; char OutPipe300, InPipe300; / 定義兩個字符數組 pipe(fd); / 創建管道 while (pid = fork( ) = -1); / 如果進程創建不成功,則空循環 if (pid = 0) / 如果子進程創建成功,pid為進程號 lockf(fd1, 1, 0); / 鎖定管道 sprintf(OutPipe, Childs PID=%dn%s,getpid(),is sending a message to parent!n); / 給Outpipe賦值 write(fd1, OutPipe, 50); / 向管道寫入數據 sleep(5); /

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論