



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)五:進(jìn)程間通信l 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)進(jìn)程間通信方式:無名管道,有名管道,信號(hào),共享內(nèi)存l 實(shí)驗(yàn)要求:(一)在父進(jìn)程中創(chuàng)建一無名管道,并創(chuàng)建子進(jìn)程來讀該管道,父進(jìn)程來寫該管道(二)在進(jìn)程中為SIGBUS注冊(cè)處理函數(shù),并向該進(jìn)程發(fā)送SIGBUS信號(hào)(三)創(chuàng)建一共享內(nèi)存,實(shí)現(xiàn)放進(jìn)程間通信l 實(shí)驗(yàn)器材:軟件:安裝了Linux的vmware虛擬機(jī)硬件:PC機(jī)一臺(tái)l 實(shí)驗(yàn)步驟:(一)無名管道的使用1、編寫實(shí)驗(yàn)代碼pipe_rw.c#include #include #include #include #include #include int main()int pipe_fd2;pid_t pid;ch
2、ar buf_r100;char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r);/*創(chuàng)建管道*/if(pipe(pipe_fd)0) /父進(jìn)程執(zhí)行代碼/1、父進(jìn)程先關(guān)閉了管道的讀端 /2、向管道寫入字符串?dāng)?shù)據(jù) /3、關(guān)閉寫端,并等待子進(jìn)程結(jié)束后退出return 0;2、編譯應(yīng)用程序pipe_rw.c3、運(yùn)行應(yīng)用程序子進(jìn)程先睡兩秒讓父進(jìn)程先運(yùn)行,父進(jìn)程分兩次寫入“hello”和“pipe”,然后阻塞等待子進(jìn)程退出,子進(jìn)程醒來后讀出管道里的內(nèi)容并打印到屏幕上再退出,父進(jìn)程捕獲到子進(jìn)程退出后也退出4、由于fork函數(shù)讓子進(jìn)程完整地拷貝了父進(jìn)程的整個(gè)地址
3、空間,所以父子進(jìn)程都有管道的讀端和寫端。我們往往希望父子進(jìn)程中的一個(gè)進(jìn)程寫一個(gè)進(jìn)程讀,那么寫的進(jìn)程最后關(guān)掉讀端,讀的進(jìn)程最好關(guān)閉掉寫端(二)信號(hào)處理1、編寫實(shí)驗(yàn)代碼sig_bus.c#include #include #include /1、自定義信號(hào)處理函數(shù),處理SIGBUS信號(hào),打印捕捉到信號(hào)即可int main()printf(Waiting for signal SIGBUS n );/2、注冊(cè)信號(hào)處理函數(shù)pause();/將進(jìn)程掛起直到捕捉到信號(hào)為止exit(0);用signal系統(tǒng)調(diào)用為SIGBUS信號(hào)注冊(cè)信號(hào)處理函數(shù)my_func,然后將進(jìn)程掛起等待SIGBUS信號(hào)。所以需要向該
4、進(jìn)程發(fā)送SIGBUS信號(hào)才會(huì)執(zhí)行自定義的信號(hào)處理函數(shù)2、編譯應(yīng)用程序sig_bus.c3、運(yùn)行應(yīng)用程序先先一個(gè)終端中運(yùn)行sig_bus,會(huì)看到進(jìn)程掛起,等待信號(hào)然后在另一個(gè)終端中,查找到運(yùn)行sig_bus這個(gè)產(chǎn)生的進(jìn)程號(hào),用kill命令發(fā)送SIGBUS信號(hào)給這個(gè)進(jìn)程我們可以看到前面掛起的進(jìn)程在接收到這個(gè)信號(hào)后的處理用自定義信號(hào)處理函數(shù)my_func來處理,所以打印了I have get SIGBUS這樣一句話(3) 共享內(nèi)存1、 本實(shí)驗(yàn)利用共享內(nèi)存完成兩個(gè)進(jìn)程之間的通信,發(fā)送端的消息類型設(shè)置為該進(jìn)程的進(jìn)程號(hào)(可以取其他值),接收端接收消息(類似消息隊(duì)列的功能),這里同時(shí)需要采用信號(hào)量為同步機(jī)制
5、完善兩個(gè)進(jìn)程間的通信。2、 下面是共享內(nèi)存緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)的定義/* shm_com.h */#ifndefSHM_COM_H#defineSHM_COM_H#include #include #include #include #include #include #include #define SHM_BUFF_SZ 2048struct shm_buffint pid;char bufferSHM_BUFF_SZ;#endif /* SHM_COM_H */以下是發(fā)送端的部分程序,請(qǐng)完善信號(hào)量的操作代碼/* producer.c */#include shm_com.h#include
6、int ignore_signal(void)signal(SIGINT, SIG_IGN);signal(SIGSTOP, SIG_IGN);signal(SIGQUIT, SIG_IGN);return 0;int main()void *shared_memory = NULL;struct shm_buff *shm_buff_inst;char bufferBUFSIZ;int shmid, semid;ignore_signal(); /* 防止程序非正常退出 */* 創(chuàng)建一個(gè)信號(hào)量*/* 初始值為1 */* 創(chuàng)建共享內(nèi)存 */shmid = shmget(ftok(., b),
7、sizeof(struct shm_buff), 0666|IPC_CREAT);if (shmid = -1)perror(shmget failed);/刪除信號(hào)量exit(1);/* 將共享內(nèi)存地址映射到當(dāng)前進(jìn)程地址空間 */shared_memory = shmat(shmid, (void*)0, 0);if (shared_memory = (void*)-1)perror(shmat);/刪除信號(hào)量exit(1);printf(Memory attached at %Xn, (int)shared_memory);/* 獲得共享內(nèi)存的映射地址 */shm_buff_inst =
8、(struct shm_buff *)shared_memory;doprintf(Enter some text to the shared memory(enter quit to exit):);/* 向共享內(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);/* 刪除信號(hào)量 */
9、* 刪除共享內(nèi)存到當(dāng)前進(jìn)程地址空間中的映射 */if (shmdt(shared_memory) = 1)perror(shmdt);exit(1);exit(0);以下是接收端程序部分,請(qǐng)完善信號(hào)量操作的代碼/* customer.c */#include shm_com.hint main()void *shared_memory = NULL;struct shm_buff *shm_buff_inst;int shmid, semid;/* 獲得信號(hào)量 */* 獲得共享內(nèi)存 */shmid = shmget(ftok(., b), sizeof(struct shm_buff), 06
10、66|IPC_CREAT);if (shmid = -1)perror(shmget);exit(1);/* 將共享內(nèi)存地址映射到當(dāng)前進(jìn)程地址空間 */shared_memory = shmat(shmid, (void*)0, 0); if (shared_memory = (void*)-1)perror(shmat);exit(1);printf(Memory attached at %Xn, (int)shared_memory);/* 獲得共享內(nèi)存的映射地址 */shm_buff_inst = (struct shm_buff *)shared_memory;doprintf(Sha
11、red memory was written by process %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)存到當(dāng)前進(jìn)程地址空間中的映射 */if (shmdt(shared_memory) = -1)perror(shmdt);exit(1);/* 刪除共享內(nèi)存 */if (shmctl(shmid, IPC_RMID, NULL) = -1)perror(shm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程業(yè)務(wù)資金管理辦法
- 執(zhí)勤車輛如何管理辦法
- 部門共享文件管理辦法
- 育嬰護(hù)理課件
- 育嬰師服務(wù)技能培訓(xùn)課件
- 育嬰健康知識(shí)課件
- 圖紙分解流程培訓(xùn)課件
- 商場(chǎng)培訓(xùn)課件圖片
- 杜集區(qū)九年級(jí)數(shù)學(xué)試卷
- 段子 數(shù)學(xué)試卷
- 2025江蘇省惠隆資產(chǎn)管理限公司招聘30人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 《農(nóng)村基層干部廉潔履行職責(zé)規(guī)定》解讀與培訓(xùn)
- 氣胸完整版本
- DB44∕T 1702.2-2015 屋面并網(wǎng)光伏發(fā)電系統(tǒng) 第2部分:施工與驗(yàn)收規(guī)范
- (新版)孤殘兒童試題庫(含答案)
- 微小灶外賣訂餐系統(tǒng)
- 通風(fēng)與空調(diào)工程施工工藝流程圖
- 協(xié)議回款承諾書
- 商業(yè)發(fā)票模板(INVOICE)
- 中英文對(duì)照財(cái)務(wù)報(bào)表-模板
- 各種常見留置管道的固定方法及注意事項(xiàng)
評(píng)論
0/150
提交評(píng)論