下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)五:進(jìn)程間通信l 實(shí)驗(yàn)?zāi)康模簩W(xué)會進(jìn)程間通信方式:無名管道,有名管道,信號,共享內(nèi)存l 實(shí)驗(yàn)要求:(一)在父進(jìn)程中創(chuàng)建一無名管道,并創(chuàng)建子進(jìn)程來讀該管道,父進(jìn)程來寫該管道(二)在進(jìn)程中為SIGBUS注冊處理函數(shù),并向該進(jìn)程發(fā)送SIGBUS信號(三)創(chuàng)建一共享內(nèi)存,實(shí)現(xiàn)放進(jìn)程間通信l 實(shí)驗(yàn)器材:軟件:安裝了Linux的vmware虛擬機(jī)硬件:PC機(jī)一臺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)程的整個地址
3、空間,所以父子進(jìn)程都有管道的讀端和寫端。我們往往希望父子進(jìn)程中的一個進(jìn)程寫一個進(jìn)程讀,那么寫的進(jìn)程最后關(guān)掉讀端,讀的進(jìn)程最好關(guān)閉掉寫端(二)信號處理1、編寫實(shí)驗(yàn)代碼sig_bus.c#include #include #include /1、自定義信號處理函數(shù),處理SIGBUS信號,打印捕捉到信號即可int main()printf(Waiting for signal SIGBUS n );/2、注冊信號處理函數(shù)pause();/將進(jìn)程掛起直到捕捉到信號為止exit(0);用signal系統(tǒng)調(diào)用為SIGBUS信號注冊信號處理函數(shù)my_func,然后將進(jìn)程掛起等待SIGBUS信號。所以需要向該
4、進(jìn)程發(fā)送SIGBUS信號才會執(zhí)行自定義的信號處理函數(shù)2、編譯應(yīng)用程序sig_bus.c3、運(yùn)行應(yīng)用程序先先一個終端中運(yùn)行sig_bus,會看到進(jìn)程掛起,等待信號然后在另一個終端中,查找到運(yùn)行sig_bus這個產(chǎn)生的進(jìn)程號,用kill命令發(fā)送SIGBUS信號給這個進(jìn)程我們可以看到前面掛起的進(jìn)程在接收到這個信號后的處理用自定義信號處理函數(shù)my_func來處理,所以打印了I have get SIGBUS這樣一句話(3) 共享內(nèi)存1、 本實(shí)驗(yàn)利用共享內(nèi)存完成兩個進(jìn)程之間的通信,發(fā)送端的消息類型設(shè)置為該進(jìn)程的進(jìn)程號(可以取其他值),接收端接收消息(類似消息隊(duì)列的功能),這里同時(shí)需要采用信號量為同步機(jī)制
5、完善兩個進(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ā)送端的部分程序,請完善信號量的操作代碼/* 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)建一個信號量*/* 初始值為1 */* 創(chuàng)建共享內(nèi)存 */shmid = shmget(ftok(., b),
7、sizeof(struct shm_buff), 0666|IPC_CREAT);if (shmid = -1)perror(shmget failed);/刪除信號量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 =
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);/* 刪除信號量 */
9、* 刪除共享內(nèi)存到當(dāng)前進(jìn)程地址空間中的映射 */if (shmdt(shared_memory) = 1)perror(shmdt);exit(1);exit(0);以下是接收端程序部分,請完善信號量操作的代碼/* customer.c */#include shm_com.hint main()void *shared_memory = NULL;struct shm_buff *shm_buff_inst;int shmid, semid;/* 獲得信號量 */* 獲得共享內(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等.壓縮文件請下載最新的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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年通過客戶體驗(yàn)優(yōu)化提高房地產(chǎn)銷售額
- 2026年電氣傳動控制系統(tǒng)的項(xiàng)目案例分享
- 2026年年房地產(chǎn)行業(yè)的重要法律法規(guī)
- 2026春招:物流專員面試題及答案
- 貨車司機(jī)安全培訓(xùn)例會課件
- 貨梯安裝培訓(xùn)課件
- 2026年電子科技大學(xué)成都學(xué)院單招綜合素質(zhì)考試備考題庫帶答案解析
- 2026年德州科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性考試備考題庫帶答案解析
- 2026年鶴壁職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題帶答案解析
- 賬務(wù)知識講解課件模板
- 飛機(jī)結(jié)構(gòu)與系統(tǒng)專業(yè)復(fù)習(xí)考試題庫 (530題)
- 2024年新疆中考數(shù)學(xué)試卷試題解讀及答案講解課件
- 迎接期末+做自己的英雄 高二上學(xué)期心理健康教育主題班會
- 招標(biāo)代理服務(wù)服務(wù)方案
- 初一數(shù)學(xué)上冊有理數(shù)加減混合運(yùn)算練習(xí)題及答案(共100題)
- 《檳榔的危害》課件
- 正畸口腔健康宣教課件
- 人工智能在檢驗(yàn)醫(yī)學(xué)中的應(yīng)用
- DB42T2043-2023既有住宅和社區(qū)適老化改造技術(shù)規(guī)范
- 單位消防安全教育培訓(xùn)記錄表
- 江蘇省工程質(zhì)量安全手冊實(shí)施細(xì)則房屋建筑工程篇(2022年版)上冊:質(zhì)量分冊
評論
0/150
提交評論