實(shí)驗(yàn)五:進(jìn)程間通信#知識(shí)材料_第1頁(yè)
實(shí)驗(yàn)五:進(jìn)程間通信#知識(shí)材料_第2頁(yè)
實(shí)驗(yàn)五:進(jìn)程間通信#知識(shí)材料_第3頁(yè)
實(shí)驗(yàn)五:進(jìn)程間通信#知識(shí)材料_第4頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論