




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗五:進程間通信實驗五:進程間通信/NUMPAGES14實驗五:進程間通信實驗五:進程間通信實驗五:進程間通信實驗目的:學會進程間通信方式:無名管道,有名管道,信號,共享內存實驗要求:(一)在父進程中創(chuàng)建一無名管道,并創(chuàng)建子進程來讀該管道,父進程來寫該管道(二)在進程中為SIGBUS注冊處理函數,并向該進程發(fā)送SIGBUS信號(三)創(chuàng)建一共享內存,實現(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、子進程先關閉了管道的寫端 //2、讓父進程先運行,這樣父進程先寫子進程才有內容讀//3、讀取管道的讀端,并輸出數據//4、關閉管道的讀端,并退出 } elseif(pid>0)//父進程執(zhí)行代碼 { //1、父進程先關閉了管道的讀端//2、向管道寫入字符串數據//3、關閉寫端,并等待子進程結束后退出 } return0;}2、編譯應用程序pipe_rw.c3、運行應用程序子進程先睡兩秒讓父進程先運行,父進程分兩次寫入“hello”和“pipe”,然后阻塞等待子進程退出,子進程醒來后讀出管道里的內容并打印到屏幕上再退出,父進程捕獲到子進程退出后也退出4、由于fork函數讓子進程完整地拷貝了父進程的整個地址空間,所以父子進程都有管道的讀端和寫端。我們往往希望父子進程中的一個進程寫一個進程讀,那么寫的進程最后關掉讀端,讀的進程最好關閉掉寫端(二)信號處理1、編寫實驗代碼sig_bus.c#include<signal.h>#include<stdio.h>#include<stdlib.h>//1、自定義信號處理函數,處理SIGBUS信號,打印捕捉到信號即可intmain(){ printf("WaitingforsignalSIGBUS\n"); //2、注冊信號處理函數 pause();//將進程掛起直到捕捉到信號為止 exit(0);}用signal系統(tǒng)調用為SIGBUS信號注冊信號處理函數my_func,然后將進程掛起等待SIGBUS信號。所以需要向該進程發(fā)送SIGBUS信號才會執(zhí)行自定義的信號處理函數2、編譯應用程序sig_bus.c3、運行應用程序 先先一個終端中運行sig_bus,會看到進程掛起,等待信號然后在另一個終端中,查找到運行sig_bus這個產生的進程號,用kill命令發(fā)送SIGBUS信號給這個進程我們可以看到前面掛起的進程在接收到這個信號后的處理用自定義信號處理函數my_func來處理,所以打印了IhavegetSIGBUS這樣一句話共享內存本實驗利用共享內存完成兩個進程之間的通信,發(fā)送端的消息類型設置為該進程的進程號(可以取其他值),接收端接收消息(類似消息隊列的功能),這里同時需要采用信號量為同步機制完善兩個進程間的通信。下面是共享內存緩沖區(qū)的數據結構的定義/*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)建共享內存*/ shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmgetfailed"); //刪除信號量 exit(1); } /*將共享內存地址映射到當前進程地址空間*/ shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat"); //刪除信號量 exit(1); } printf("Memoryattachedat%X\n",(int)shared_memory); /*獲得共享內存的映射地址*/ shm_buff_inst=(structshm_buff*)shared_memory; do { printf("Entersometexttothesharedmemory(enter'quit'toexit):"); /*向共享內存寫入數據*/ 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); /*刪除信號量*/ /*刪除共享內存到當前進程地址空間中的映射*/ 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; /*獲得信號量*/ /*獲得共享內存*/ shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmget"); exit(1); } /*將共享內存地址映射到當前進程地址空間*/ shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat"); exit(1); } printf("Memoryattachedat%X\n",(int)shared_memory); /*獲得共享內存的映射地址*/ 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); /*刪除共享內存到當前進程地址空間中的映射*/ if(shmdt(shared_memory)==-1) { perror("shmdt"); exit(1); } /*刪除共享內存*/ if(shmctl(shmid,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東酒店管理職業(yè)技術學院《Java語言程序設計B》2023-2024學年第二學期期末試卷
- 江蘇海事職業(yè)技術學院《植物營養(yǎng)分子生物學基礎》2023-2024學年第二學期期末試卷
- 公司門衛(wèi)管理制度及崗位職責
- 【2025年飲食產業(yè)布局加速:澳門零售與餐飲市場呈現(xiàn)分化趨勢】
- 監(jiān)控機房施工方案
- 直線段支架施工方案
- 保溫冷棚施工方案
- 一卡通方案資料
- 5年級下冊數學所有公式
- 5年級第6單元語文園地筆記上冊
- 如何建立卓越地價值觀
- 舞臺搭建方面基礎知識
- 小學六年級數學計算題100道(含答案)
- 餐飲環(huán)節(jié) 日管控、周排查、月調度內容
- 【讀寫策略】回延安朗讀指導
- sg-uap v3.00高級開發(fā)手冊分冊1概述
- 型鋼孔型設計01-孔型設計的基本知識
- Q-CR 9520-2018 高速鐵路通信工程細部設計和工藝質量標準
- 九下:22《陳涉世家》課件
- 《有機化學》第7章 鹵代烴
- 數據挖掘導論-第5章-分類-其他技術
評論
0/150
提交評論