版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
實驗五:進程間通信實驗五:進程間通信/NUMPAGES14實驗五:進程間通信實驗五:進程間通信實驗五:進程間通信實驗目的:學會進程間通信方式:無名管道,有名管道,信號,共享內(nèi)存實驗要求:(一)在父進程中創(chuàng)建一無名管道,并創(chuàng)建子進程來讀該管道,父進程來寫該管道(二)在進程中為SIGBUS注冊處理函數(shù),并向該進程發(fā)送SIGBUS信號(三)創(chuàng)建一共享內(nèi)存,實現(xiàn)放進程間通信實驗器材:軟件:安裝了Linux的vmware虛擬機硬件:PC機一臺實驗步驟:(一)無名管道的使用1、編寫實驗代碼pipe_rw.c#include<unistd.h>#include<sys/types.h>#include<errno.h>#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(){ intpipe_fd[2]; pid_tpid; charbuf_r[100]; char*p_wbuf; intr_num; memset(buf_r,0,sizeof(buf_r)); /*創(chuàng)建管道*/ if(pipe(pipe_fd)<0) { printf("pipecreateerror\n"); return-1; } /*創(chuàng)建子進程*/ if((pid=fork())==0)//子進程執(zhí)行代碼 { //1、子進程先關(guān)閉了管道的寫端 //2、讓父進程先運行,這樣父進程先寫子進程才有內(nèi)容讀//3、讀取管道的讀端,并輸出數(shù)據(jù)//4、關(guān)閉管道的讀端,并退出 } elseif(pid>0)//父進程執(zhí)行代碼 { //1、父進程先關(guān)閉了管道的讀端//2、向管道寫入字符串數(shù)據(jù)//3、關(guān)閉寫端,并等待子進程結(jié)束后退出 } return0;}2、編譯應用程序pipe_rw.c3、運行應用程序子進程先睡兩秒讓父進程先運行,父進程分兩次寫入“hello”和“pipe”,然后阻塞等待子進程退出,子進程醒來后讀出管道里的內(nèi)容并打印到屏幕上再退出,父進程捕獲到子進程退出后也退出4、由于fork函數(shù)讓子進程完整地拷貝了父進程的整個地址空間,所以父子進程都有管道的讀端和寫端。我們往往希望父子進程中的一個進程寫一個進程讀,那么寫的進程最后關(guān)掉讀端,讀的進程最好關(guān)閉掉寫端(二)信號處理1、編寫實驗代碼sig_bus.c#include<signal.h>#include<stdio.h>#include<stdlib.h>//1、自定義信號處理函數(shù),處理SIGBUS信號,打印捕捉到信號即可intmain(){ printf("WaitingforsignalSIGBUS\n"); //2、注冊信號處理函數(shù) pause();//將進程掛起直到捕捉到信號為止 exit(0);}用signal系統(tǒng)調(diào)用為SIGBUS信號注冊信號處理函數(shù)my_func,然后將進程掛起等待SIGBUS信號。所以需要向該進程發(fā)送SIGBUS信號才會執(zhí)行自定義的信號處理函數(shù)2、編譯應用程序sig_bus.c3、運行應用程序 先先一個終端中運行sig_bus,會看到進程掛起,等待信號然后在另一個終端中,查找到運行sig_bus這個產(chǎn)生的進程號,用kill命令發(fā)送SIGBUS信號給這個進程我們可以看到前面掛起的進程在接收到這個信號后的處理用自定義信號處理函數(shù)my_func來處理,所以打印了IhavegetSIGBUS這樣一句話共享內(nèi)存本實驗利用共享內(nèi)存完成兩個進程之間的通信,發(fā)送端的消息類型設置為該進程的進程號(可以取其他值),接收端接收消息(類似消息隊列的功能),這里同時需要采用信號量為同步機制完善兩個進程間的通信。下面是共享內(nèi)存緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)的定義/*shm_com.h*/#ifndef SHM_COM_H#define SHM_COM_H#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHM_BUFF_SZ2048structshm_buff{ intpid; charbuffer[SHM_BUFF_SZ];};#endif/*SHM_COM_H*/以下是發(fā)送端的部分程序,請完善信號量的操作代碼/*producer.c*/#include"shm_com.h"#include<signal.h>intignore_signal(void){ signal(SIGINT,SIG_IGN); signal(SIGSTOP,SIG_IGN); signal(SIGQUIT,SIG_IGN); return0;}intmain(){ void*shared_memory=NULL; structshm_buff*shm_buff_inst; charbuffer[BUFSIZ]; intshmid,semid; ignore_signal();/*防止程序非正常退出*/ /*創(chuàng)建一個信號量*/ /*初始值為1*/ /*創(chuàng)建共享內(nèi)存*/ shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmgetfailed"); //刪除信號量 exit(1); } /*將共享內(nèi)存地址映射到當前進程地址空間*/ shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat"); //刪除信號量 exit(1); } printf("Memoryattachedat%X\n",(int)shared_memory); /*獲得共享內(nèi)存的映射地址*/ shm_buff_inst=(structshm_buff*)shared_memory; do { printf("Entersometexttothesharedmemory(enter'quit'toexit):"); /*向共享內(nèi)存寫入數(shù)據(jù)*/ if(fgets(shm_buff_inst->buffer,SHM_BUFF_SZ,stdin)==NULL) { perror("fgets"); sem_v(semid); break; } shm_buff_inst->pid=getpid(); }while(strncmp(shm_buff_inst->buffer,"quit",4)!=0); /*刪除信號量*/ /*刪除共享內(nèi)存到當前進程地址空間中的映射*/ if(shmdt(shared_memory)==1) { perror("shmdt"); exit(1); } exit(0);}以下是接收端程序部分,請完善信號量操作的代碼/*customer.c*/#include"shm_com.h"intmain(){ void*shared_memory=NULL; structshm_buff*shm_buff_inst; intshmid,semid; /*獲得信號量*/ /*獲得共享內(nèi)存*/ shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmget"); exit(1); } /*將共享內(nèi)存地址映射到當前進程地址空間*/ shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat"); exit(1); } printf("Memoryattachedat%X\n",(int)shared_memory); /*獲得共享內(nèi)存的映射地址*/ shm_buff_inst=(structshm_buff*)shared_memory; do { printf("Sharedmemorywaswrittenbyprocess%d:%s",shm_buff_inst->pid,shm_buff_inst->buffer); if(strncmp(shm_buff_inst->buffer,"quit",4)==0) { break; } shm_buff_inst->pid=0; memset(shm_buff_inst->buffer,0,SHM_BUFF_SZ); }while(1); /*刪除共享內(nèi)存到當前進程地址空間中的映射*/ if(shmdt(shared_memory)==-1) { perror("shmdt"); exit(1); } /*刪除共享內(nèi)存*/ if(shmctl(shmid,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度旅客運輸服務質(zhì)量監(jiān)督合同3篇
- 二零二五年職工住房借款與物業(yè)服務一體化合同3篇
- 2025年版環(huán)保產(chǎn)業(yè)廣告宣傳與公益合作合同4篇
- 二零二五年度板材夾板定制生產(chǎn)及品牌代理合同
- 二零二五年版影視作品版權(quán)授權(quán)合同法律效力解析4篇
- 二零二五版XX型號花崗巖打磨翻新與保養(yǎng)服務協(xié)議3篇
- 水庫漁業(yè)捕撈二零二五年度質(zhì)量檢測承包合同2篇
- 二零二五年度白酒企業(yè)團購合作銷售協(xié)議2篇
- 二零二五年度家具行業(yè)廣告代理居間代理協(xié)議3篇
- 二零二五年度網(wǎng)絡安全防護股東投資合作協(xié)議范本3篇
- 2023社會責任報告培訓講稿
- 2023核電廠常規(guī)島及輔助配套設施建設施工技術(shù)規(guī)范 第8部分 保溫及油漆
- 2025年蛇年春聯(lián)帶橫批-蛇年對聯(lián)大全新春對聯(lián)集錦
- 表B. 0 .11工程款支付報審表
- 警務航空無人機考試題庫及答案
- 空氣自動站儀器運營維護項目操作說明以及簡單故障處理
- 新生兒窒息復蘇正壓通氣課件
- 法律顧問投標書
- 班主任培訓簡報4篇(一)
- 成都市數(shù)學八年級上冊期末試卷含答案
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復重建的專家共識
評論
0/150
提交評論