




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實驗四 Linux進程間通信一. 實驗?zāi)康募由顚Σ僮飨到y(tǒng)進程間通信機制的理解,掌握利用管道、共享內(nèi)存、消息通信和信號量集等機制實現(xiàn)進程間通信的程序設(shè)計技術(shù)。二. 實驗指導(dǎo)在多任務(wù)計算機系統(tǒng)中,每個進程都具有自己獨立的全局變量和局部變量,子進程幾乎完全獨立于創(chuàng)建它的進程。進程之間交換信息需要借用操作系統(tǒng)內(nèi)核提供的進程間通信(IPC)機制來實現(xiàn)。常見的進程間通信方法有:共享內(nèi)存、信號量、管道/命名管道、消息隊列、套接口和全雙工管道等。前5種只適應(yīng)于處于同一臺主機的本地進程間通信,后2種方式還適應(yīng)于運行在2臺不同計算機系統(tǒng)上的兩個進程間通信。Linux系統(tǒng)提供了一組系統(tǒng)調(diào)用作為用戶使用其進程間通信機
2、制的接口。(一) 管道通信系統(tǒng)調(diào)用1文件鎖定系統(tǒng)調(diào)用函數(shù)說明:#include unistd.hint lockf(int files, int function, long size);其中:files是文件描述符;function是鎖定和解鎖:1表示鎖定,0表示解鎖。size是鎖定或解鎖的字節(jié)數(shù),為0,表示從文件的當(dāng)前位置到文件尾。2. 創(chuàng)建無名管道系統(tǒng)調(diào)用函數(shù)說明: #include #inlcude int pipe(int filedes2);執(zhí)行系統(tǒng)調(diào)用后,filedes1是管道寫入端,filedes0是管道讀出端。(二) 消息通信系統(tǒng)調(diào)用1. 創(chuàng)建消息隊列系統(tǒng)調(diào)用msgget(
3、) 函數(shù)說明:#include#include#includeint msgget(key_t key, int flag);參數(shù)說明:key 用戶指定的消息隊列的名字;flag 用戶設(shè)置的標(biāo)志和訪問方式。如 IPC_CREAT |0666 如果該隊列已經(jīng)存在,存在則返回該消息隊列描述符,不存在則創(chuàng)建一個新的消息隊列。2. 發(fā)送消息系統(tǒng)調(diào)用向指定的消息隊列發(fā)送一個消息,并將該消息鏈接到該消息隊列的尾部。函數(shù)說明:#include #include #include int msgsnd(int msgqid, struct msgbuf * msgp, int size, int flag);
4、其中msgqid是返回消息隊列的描述符;msgp是指向用戶消息緩沖區(qū)的一個結(jié)構(gòu)體指針,size指示由msgp指向的數(shù)據(jù)結(jié)構(gòu)中字符數(shù)組的長度。緩沖區(qū)中包括消息類型和消息正文,即: struct msgbuf long mtype; /*消息類型*/ char mtext ; /*消息的文本*/3. 消息接收系統(tǒng)調(diào)用從指定的消息隊列中接收一個指定類型的消息, 并從消息隊列中刪除此消息。消息隊列沒有消息則等待。函數(shù)說明: #include #include #include int msgrcv(int msgqid, struct msgbuf *msgp, int size, int type,
5、 int flag);其中,msgqid,msgp,size,flag與msgsnd中的對應(yīng)參數(shù)相似,type是規(guī)定要接收的消息類型。根據(jù)type的不同接收消息有3種方式:type=0,接收該隊列的第一個消息,并將它返回給調(diào)用者;type為正整數(shù),接收類型type的第一個消息;type為負整數(shù),接收小于等于type絕對值的最低類型的第一個消息。4. 消息隊列控制系統(tǒng)調(diào)用消息隊列控制函數(shù),用于讀取消息隊列的狀態(tài)信息并進行修改,如查詢消息隊列描述符、修改它的許可權(quán)及刪除該隊列等。函數(shù)格式: #include #include #include int msgctl(int msgqid, int
6、cmd, struct msgqid_ds *buf); int msgqid,cmd; struct msgqid_ds *buf;其中,函數(shù)調(diào)用成功時返回0,不成功則返回-1。buf是用戶緩沖區(qū)地址,供用戶存放控制參數(shù)和查詢結(jié)果;cmd是規(guī)定的命令,命令可分三類:(1)IPC_STAT。查詢有關(guān)消息隊列情況的命令。如查詢隊列中的消息數(shù)目、隊列中的最大字節(jié)數(shù)、最后一個發(fā)送消息的進程標(biāo)識符、發(fā)送時間等;(2)IPC_SET。按buf指向的結(jié)構(gòu)中的值,設(shè)置和改變有關(guān)消息隊列屬性的命令。如改變消息隊列的用戶標(biāo)識符、消息隊列的許可權(quán)等;(3)IPC_RMID。消除消息隊列的標(biāo)識符。(三) 共享內(nèi)存通
7、信系統(tǒng)調(diào)用1. 創(chuàng)建、檢索一個共享存儲區(qū)函數(shù)格式:#include#include#include int shmget(key_t key, int size, int flag); 其中,key是共享存儲區(qū)關(guān)鍵字;size是其大?。ㄒ宰止?jié)計);flag是用戶設(shè)置的標(biāo)志:IPC_CREAT表示若系統(tǒng)中尚無指名的共享存儲區(qū),則由核心建立一個共享存儲區(qū);若系統(tǒng)中已有共享存儲區(qū),返回存在的共享內(nèi)存區(qū)標(biāo)識符。2. 獲得共享內(nèi)存區(qū)虛擬地址 從邏輯上將一個共享存儲區(qū)附接到進程的虛擬地址空間上。函數(shù)格式:#include#include#include char *shmat(int shmid, cha
8、r *addr, int flag);其中,shmid是共享存儲區(qū)的標(biāo)識符;addr是用戶給定的,將共享存儲區(qū)附接到進程的虛地址空間,其值為0時,由系統(tǒng)分配共享內(nèi)存的虛擬內(nèi)存地址;flag規(guī)定共享存儲區(qū)的讀、寫權(quán)限,以及系統(tǒng)是否應(yīng)對用戶規(guī)定的地址做舍入操作,SHM_RDONLY表示只讀,0表示可讀寫。該系統(tǒng)調(diào)用的返回值是共享存儲區(qū)所附接到的進程虛擬地址viraddr。3. 斷開共享內(nèi)存的進程虛擬地址把一個共享存儲區(qū)從指定進程的虛地址空間斷開。函數(shù)格式:#include#include#include int shmdt(char *addr);其中,addr是要斷開連接的虛地址,亦即以前由連接
9、的系統(tǒng)調(diào)用shmat( )所返回的虛地址。調(diào)用成功時,返回0值,調(diào)用不成功,返回-1。4. 共享存儲區(qū)的控制讀取和修改共享內(nèi)存區(qū)域的狀態(tài)。函數(shù)格式:#include#include#include int shmctl(int shmid, int cmd, struct shmid_ds *buf); int shmid,cmd; struct shmid_ds *buf;其中,buf是用戶緩沖區(qū)地址,cmd是操作命令。命令可分為多種類型:(1)用于查詢有關(guān)共享存儲區(qū)的情況。如其長度、當(dāng)前連接的進程數(shù)、共享區(qū)的創(chuàng)建者標(biāo)識符等;(2)用于設(shè)置或改變共享存儲區(qū)的屬性。如共享存儲區(qū)的許可權(quán)、當(dāng)前連
10、接的進程計數(shù)等;(3)對共享存儲區(qū)的加鎖和解鎖命令;(4)刪除共享存儲區(qū)標(biāo)識符等。上述的查詢是將shmid所指示的數(shù)據(jù)結(jié)構(gòu)中的有關(guān)成員,放入所指示的緩沖區(qū)中;而設(shè)置是用由buf所指示的緩沖區(qū)內(nèi)容來設(shè)置由shmid所指示的數(shù)據(jù)結(jié)構(gòu)中的相應(yīng)成員。(四) 信號量系統(tǒng)調(diào)用1. 信號量集合的創(chuàng)建與檢索系統(tǒng)創(chuàng)建與檢索信號量集合。函數(shù)格式:#include#include#include int semget(key_t key, int nsems, int semflag);其中,Key: IPC_PRIVATE時,關(guān)鍵字由系統(tǒng)選擇;nsems : 信號量集中信號量的個數(shù);semflags: 指定信號量
11、的訪問權(quán)限和操作模式,取值:0 xyz: 低3位8進制數(shù)與文件權(quán)限一致 IPC_CREAT(00001000): 創(chuàng)建新的信號量集合,或返回已存在的信號量集 IPC_CREAT(00002000):檢索信號量集合2. 信號量集操作函數(shù)格式:#include#include#include int semop(int semid, struct sembuf *sops, unsigned nops);其中,semid: 信號量集合;sops : 信號量操作參數(shù);nops:本次操作的信號量個數(shù);參數(shù)類型struct sembuf的定義如下:struct sembuf short sem_num;
12、 /信號燈編號,從0開始 short sem_op; /信號燈操作數(shù),對應(yīng)信號燈增加或減少該值 short sem_flg; /操作標(biāo)志,通常為0。為IPC_NOWAIT時,信號量操作結(jié)果為負值也不阻塞 sem_op0: 釋放資源,實施V操作,semval加sem_op sem_op=0: 則semval0,繼續(xù)執(zhí)行, semval!=0, 則阻塞,加入等待隊列三. 實驗內(nèi)容與步驟1. 無名管道實驗編寫程序unnamed_pipe.c實現(xiàn)進程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一個無名管道,在創(chuàng)建2個子進程P1和P2。然后讓2個子進程P1和P2分別向管道各寫一句話: Child 1 is
13、sending a message! Child 2 is sending a message!父進程從管道中讀出2個來自子進程的信息并顯示。 unnamed_pipe.c的參考程序請見附錄4。2. 命名管道實驗修改unnamed_pipe.c無名管道通信程序,改造成2個程序client.c和server.c,2個進程之間通過命名管道通信。運行client 2次,產(chǎn)生2個client進程,分別向管道寫一句話: Child 1 is sending a message!Child 2 is sending a message!server進程從管道讀出子進程發(fā)送的信息并顯示。3. 消息通信實驗1
14、)使用消息通信機制編寫消息發(fā)送和接收的程序,2個進程間傳送文本串信息。消息發(fā)送程序是msg_client.c,消息接收程序是msg_server.c。msg_client.c的參考程序請見附錄4。msg_server.c的參考程序請見附錄4。2)修改消息通信程序msg_server.c和msg_client.c,在2個進程之間傳遞消息正文為隨機數(shù)的消息。提示:可將產(chǎn)生的隨機數(shù)轉(zhuǎn)換成字符串后寫入消息正文發(fā)送,方法如下: sscanf(msg.mtext, “%6d”, rand();4. 共享內(nèi)存實驗1)編寫程序shmem.c,該程序產(chǎn)生2個子進程server和client,并以共享內(nèi)存方式傳遞
15、整數(shù)值。Client向server傳遞一些整數(shù)值,如傳遞整數(shù)1到9,要求兩個進程實現(xiàn)同步。shmem.c的參考程序見附錄4。2) 編寫共享內(nèi)存通信程序father.c, child.c和semaphore.c。運行father.c產(chǎn)生father進程,從標(biāo)準(zhǔn)輸入讀入一行文本串,寫入共享內(nèi)存;運行child.c產(chǎn)生child進程,從通信內(nèi)存讀取文本串并從終端顯示。semaphore.c利用Linux的信號量集機制實現(xiàn)信號量和P、V操作函數(shù),2個進程通過P、V操作實現(xiàn)同步。father.c、child.c和semaphore.c的參考程序請見附錄4。3) 改寫father.c和child.c程序,實現(xiàn)生產(chǎn)者消費者問題,生產(chǎn)者程序為proucer.c,消費者程序為consumer.c,緩沖區(qū)為一個共享內(nèi)存,2個進程共同實現(xiàn)一個文本文件shmem.c的讀入與顯示。producer進程每次從shmem.c讀入一行文本到共享內(nèi)存區(qū),consumer進程從共享內(nèi)存去讀出文本顯示,2個進程使用信號燈和P、V操作實現(xiàn)同步。四. 實驗報告1. 命名管道實驗:寫出程序unnamed_pipe.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年安全管理員安全培訓(xùn)考試試題可打印
- 2025新版車間安全培訓(xùn)考試試題及完整答案(必刷)
- 2025管理人員安全培訓(xùn)考試試題及參考答案(精練)
- 2025合同糾紛解決的關(guān)鍵要素
- 2025購銷合同轉(zhuǎn)讓協(xié)議范本
- 2025私營企業(yè)員工的人事合同范本
- 2025房產(chǎn)買賣合同書
- 2025年電子線圈設(shè)備項目建議書
- 2025標(biāo)準(zhǔn)版汽車銷售合同協(xié)議書
- 2025建筑公司標(biāo)準(zhǔn)版勞動合同
- 大型活動策劃與管理第八章 大型活動風(fēng)險管理
- Q∕GDW 12165-2021 高海拔地區(qū)運維檢修裝備配置規(guī)范
- 現(xiàn)代風(fēng)險導(dǎo)向?qū)徲嬙谔旌鈺嫀熓聞?wù)所的應(yīng)用研究
- JGJ107-2016鋼筋機械連接技術(shù)規(guī)程
- 婦科醫(yī)生進修匯報課件
- 動態(tài)分析與設(shè)計實驗報告總結(jié)
- 2024年江蘇省泰州市海陵區(qū)中考一模數(shù)學(xué)試卷
- 從汽車檢測看低空飛行器檢測發(fā)展趨勢
- DB32T 4740-2024 耕地和林地損害程度鑒定規(guī)范
- 五一節(jié)假日安全生產(chǎn)培訓(xùn)
- 中考英語二輪復(fù)習(xí)課件:中考解題技巧-讀寫綜合
評論
0/150
提交評論