



版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)五:進(jìn)程間通信l 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)進(jìn)程間通信方式:無(wú)名管道,有名管道,信號(hào),共享內(nèi)存l 實(shí)驗(yàn)要求:(一)在父進(jìn)程中創(chuàng)建一無(wú)名管道,并創(chuàng)建子進(jìn)程來(lái)讀該管道,父進(jìn)程來(lái)寫該管道(二)在進(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)步驟:(一)無(wú)名管道的使用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)程醒來(lái)后讀出管道里的內(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來(lái)處理,所以打印了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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傣族舞蹈文化特征
- 幼兒手指律動(dòng)《啊嗚手指歌》
- 2025網(wǎng)簽版合作協(xié)議合同
- 人教版小學(xué)二年級(jí)上冊(cè)數(shù)學(xué) 第1單元 第2課時(shí) 認(rèn)識(shí)米 用米量 教案
- 軟件開(kāi)發(fā)合同技術(shù)合同協(xié)議書
- 2025關(guān)于企業(yè)辦公租賃合同文本范例
- 2025建筑工程水電安裝勞務(wù)分包合同
- 版二手住宅買賣合同書樣本
- 農(nóng)戶土地承包合同簽訂指南
- 2025駕駛員安全責(zé)任合同
- UL746A標(biāo)準(zhǔn)中文版-2019聚合材料短期性能評(píng)估第六版
- 危險(xiǎn)化學(xué)品目錄(2024版)
- 2024年裝飾公司員工合同范本
- 患者床頭抬高
- 2024-2025學(xué)年第一學(xué)期高二教學(xué)質(zhì)量檢測(cè)歷史答案
- 2021年1月維修電工高級(jí)技師模擬試題及答案卷3
- 2024年學(xué)校采購(gòu)員崗位職責(zé)(五篇)
- 藥物臨床試驗(yàn)儀器設(shè)備管理制度
- 基于深度學(xué)習(xí)的小學(xué)數(shù)學(xué)跨學(xué)科主題探究
- 2024年全國(guó)統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- DB65-T 4828-2024 和田玉(子料)鑒定
評(píng)論
0/150
提交評(píng)論