




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
課程實驗報告課程名稱計算機操作系統班級網絡102班實驗日期2013.4.11姓名李東亮學號201007118實驗成績實驗名稱實驗4進程通信實驗目的及要求1、 加深理解進程通信的方法與原理;2、 掌握如何利用管道機制、消息緩沖隊列、共享存儲區機制進行進程間的通信。實驗環境操作系統:Win732位虛擬機:VmwareLinux系統:ubuntu11.10實驗內容1、 了解系統調用pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和實現過程。2、 編寫一C語言程序,使其用管道來實現父子進程間通信。子進程向父進程發送字符串“issendingamessagetoparent!”;父進程則從管道中讀出子進程發來的消息,并將其顯示到屏幕上,然后終止。3、 運行該程序,觀察、記錄并簡單分析其運行結果。1.管道是基于文件描述符的通信方式,當一個管道建立時,它會創建
調試過程及實驗結果兩個文件描述符fds[0]和fds[1],其中fds[0]固定用于讀管道,而fd[1]固定用于寫管道,這樣就構成了一個半雙工的通道,管道關閉時只需將這兩個文件描述符關閉即可,可使用普通的close函數逐個關閉各個文件描述符,創建管道可以通過調用pipe來實現。調試過程及實驗結果msgget()系統調用格式intmsgget(key_tkey,intmsgflg);功能:獲取與某個鍵關聯的消息隊列標識。消息隊列被建立的情況有兩種: (1)如果鍵的值是IPC_PRIVATE。(2)或者鍵的值不是IPC_PRIVATE,并且鍵所對應的消息隊列不存在,同時標志中指定IPC_CREAT。參數定義key:消息隊列關聯的鍵。msgflg:消息隊列的建立標志和存取權限msgsnd()和msgrcv()系統調用格式intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);ssize_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);功能:在消息隊列上進行收發消息。為了發送消息,調用進程對消息隊列必須有寫權限。接收消息時必須有讀權限。參數定義msqid:消息隊列的識別碼。msgp:指向消息緩沖區的指針,此位置用來暫時存儲發送和接收的消息,是一個用戶可定義的通用結構,形態如下structmsgbuf{longmtype;/*消息類型,必須>0*/charmtext[100];/*消息文本*/};msgsz:消息的大小。msgtyp:從消息隊列內讀取的消息形態。如果值為零,則表示消息隊列中的所有消息都會被讀取。msgctl()系統調用格式intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);功能:在指定的消息隊列上執行某種控制操作。參數定義msqid:消息隊列識別碼。shmget()用于創建(或者獲取)一個由key鍵值指定的共享內存對象,返回該對象的系統標識符:shmid;系統調用格式:shmid=shmget(key,size,flag)該函數使用頭文件如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>參數定義 intshmget(key,size,flag); key_tkey;intsize,flag;其中,key是共享存儲區的名字;size是其大小(以字節計);flag是用戶設置的標志,如IPC_CREAT。IPC_CREAT表示若系統中尚無指名的共享存儲區,則由核心建立一個共享存儲區;若系統中已有共享存儲區,便忽略IPC_CREATshmat()共享存儲區的附接。從邏輯上將一個共享存儲區附接到進程的虛擬地址空間上。用于建立調用進程與由標識符shmid指定的共享內存對象之間的連接。系統調用格式:virtaddr=shmat(shmid,addr,flag)該函數使用頭文件如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>參數定義char*shmat(shmid,addr,flag);intshmid;/*SHM標識符*/char*addr;/*相當于偏移量*/intflag;/*標志*shmt()用于斷開調用進程與共享內存對象之間的連接,成功時返回0,失敗時返回-1。系統調用格式: 一intshmdt(shmaddr)char*shmaddr;/*采用shmat函數的返回值*/shmctl()共享存儲區的控制,對其狀態信息進行讀取和修改。用于對已創建的共享內存對象進行查詢、設置、刪除等操作。系統調用格式:shmctl(shmid,cmd,buf)該函數使用頭文件如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>參數定義intshmctl(shmid,cmd,buf);intshmid;/*由shmget獲取的SHM的標識符*/ intcmd;/*將對SHM進行的控structshmid_ds*buf;/*存放操作數*/2.用vi編輯器編寫代碼:運行結果:
gcc-g-'Wdllpipe*c-opipeldl^ltdongliaRg:~$,/pipeissendingamessagetoparent!.ldl^li(iDngliarbg:~$£3.先是創建一個管道,再通過fork()函數創建一子進程,該子進程會繼承父進程所創建的管道。,為了實現父子進程之間的讀寫,只需把無關的讀端或寫端的文件描述符關閉即可。例如在圖8.5中把父進程的寫端fd[1]和子進程的讀端fd[0]關閉。這時,父子進程之間就建立起了一條“子進程寫入父進程讀”的通道。總結-只有在管道的讀端存在時向管道中寫入數據才有意義。否則,向管道中寫入數據的進程將收到內核傳來的SIFPIPE信號(通常Brokenpipe錯誤)。-向管道中寫入數據時,linux將不保證寫入的原子性,管道緩沖區一有空閑區域,寫進程就會試圖向管道寫入數據。如果讀進程不讀取管道緩沖區中的數據,那么寫操作將會一直阻塞。-父子進程在運行時,它們的先后次序并不能保證,因此,在這里為了保證父進程已經關閉了讀描述符,可在子進程中調用sleep函數附錄#include<stdio.h>//printf#include<stdlib.h>//exit#include<unistd.h>//pipe#include<string.h>//strlen#include<pthread.h>//pthread_createintmain(){intfd[2];intpid=0;charstr[]="issendingamessagetoparent!";charreadbuf[1024];if(pipe(fd)<0){printf("pipeerror!\n");}if((pid=fork())<0){printf("forkerror!\n");}elseif(pid==0){//closere
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抗菌包裝設計-洞察及研究
- 2025年農業灌溉用水高效利用與農田水利工程建設與管理創新報告
- 2024年麗水市公務員考試行測真題有答案詳解
- 2024年河北省公務員考試行測試卷歷年真題及1套完整答案詳解
- 一年級數學計算題專項練習1000題匯編
- 運動防護材料設計-洞察及研究
- 2025年工業互聯網平臺IPv6技術升級下的工業互聯網平臺生態合作伙伴關系構建策略報告
- 校園安全管理報告:2025年智慧校園安全教育與心理健康教育相結合實踐
- 數字化技術在模具制造中的應用2025年仿真技術發展現狀與趨勢報告
- 2025年能源行業能源金融風險管理報告
- 通信員工安全試題及答案
- 2025年洗紋身協議書
- 工會廠務公開課件
- 桃花源記的試題及答案
- 工廠計件獎罰管理制度
- 2024年陜西省西安市初中學業水平模擬考試地理試卷
- 2025黑龍江省交通投資集團限公司招聘348人易考易錯模擬試題(共500題)試卷后附參考答案
- cpsm考試試題及答案
- 匯川技術高壓變頻器技術標準教材
- 2025年玻璃鋼圍網漁船項目市場調查研究報告
- 江蘇省南京2022年中考歷史試卷(解析版)
評論
0/150
提交評論