實(shí)驗(yàn)六進(jìn)程間通信_(tái)第1頁
實(shí)驗(yàn)六進(jìn)程間通信_(tái)第2頁
實(shí)驗(yàn)六進(jìn)程間通信_(tái)第3頁
實(shí)驗(yàn)六進(jìn)程間通信_(tái)第4頁
實(shí)驗(yàn)六進(jìn)程間通信_(tái)第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、實(shí)驗(yàn)六進(jìn)程間通信實(shí)驗(yàn)六 進(jìn)程間通信 v預(yù)備知識(shí)Linux進(jìn)程間通信進(jìn)程軟中斷通信管道和消息隊(duì)列v實(shí)驗(yàn)指導(dǎo)軟中斷通信函數(shù)管道通信的使用消息隊(duì)列的應(yīng)用v實(shí)驗(yàn)?zāi)康?、?nèi)容1.1 Linux進(jìn)程間通信v實(shí)現(xiàn)數(shù)據(jù)傳輸、數(shù)據(jù)共享、事件通知、資源共享和進(jìn)程控制等vLinux的進(jìn)程間通信方式管道(Pipe)和有名管道(Named Pipe)信號(hào)(Signal)消息(Message)隊(duì)列共享內(nèi)存信號(hào)量(Semaphore)套接口(Socket)1.1 Linux進(jìn)程間通信管道和有名管道v管道用于具有親緣關(guān)系進(jìn)程間的通信管道是半雙工的,數(shù)據(jù)只能單向流動(dòng)(雙方通信需建立兩個(gè)管道)管道只能用于父子進(jìn)程或兄弟進(jìn)程之間管道

2、對(duì)于管道兩端的進(jìn)程而言就是一個(gè)文件,并單獨(dú)構(gòu)成一種文件系統(tǒng),存在于內(nèi)存中寫管道的內(nèi)容添加在管道緩沖區(qū)的末尾,讀管道則從緩沖區(qū)頭部讀出v有名管道在普通管道具備功能基礎(chǔ)上,通過給管道命名的方法變成管道文件,允許無親緣關(guān)系進(jìn)程間通過訪問管道文件進(jìn)行通信1.1 Linux進(jìn)程間通信信號(hào)v在一個(gè)或多個(gè)進(jìn)程之間傳遞異步信號(hào)v類似于Windows下的消息,用于通知接收進(jìn)程有某種事件發(fā)生v當(dāng)某個(gè)信號(hào)出現(xiàn)時(shí),系統(tǒng)有三種處理方式:忽略信號(hào):大多數(shù)信號(hào)使用,但SIGKIL和SIGSTOP不能被忽略捕捉信號(hào):通知內(nèi)核在某種信號(hào)發(fā)生時(shí),調(diào)用一個(gè)用戶函數(shù)執(zhí)行系統(tǒng)默認(rèn)動(dòng)作:異常終止(abort)、退出(exit)、忽略(i

3、gnore)、停止(stop)或繼續(xù)(continue)1.1 Linux進(jìn)程間通信消息隊(duì)列v也叫報(bào)文隊(duì)列,是消息的鏈接表v有兩種類型的消息隊(duì)列:POSIX消息隊(duì)列和系統(tǒng)V消息隊(duì)列v運(yùn)行于同一臺(tái)機(jī)器上的進(jìn)程間通信,與管道類似v消息內(nèi)存可根據(jù)需要自行定義,可忽略信號(hào)承載信息量少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)v可以用流管道或套接口方式取代1.1 Linux進(jìn)程間通信共享內(nèi)存v在系統(tǒng)內(nèi)核分配一塊緩沖區(qū),多個(gè)進(jìn)程都可以訪問該緩沖區(qū)v效率高:進(jìn)程可以直接讀寫內(nèi)存,不需任何數(shù)據(jù)拷貝,避免了內(nèi)核空間與用戶空間的切換v同步和協(xié)議都不受程序員控制,必須確保將句柄傳遞給子進(jìn)程和線程,需與其它通

4、信機(jī)制結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥v多用于存儲(chǔ)應(yīng)用程序的配置信息1.1 Linux進(jìn)程間通信信號(hào)量v也稱信號(hào)燈,用來協(xié)調(diào)不同進(jìn)程間的數(shù)據(jù)對(duì)象v提供對(duì)進(jìn)程間共享資源訪問控制的手段,用來保護(hù)共享資源v還可用于進(jìn)程間及同一進(jìn)程不同線程間的進(jìn)程同步v兩種類型二值信號(hào)燈:取值只能為0或1,類似于互斥鎖計(jì)算信號(hào)燈:取值可以為任意非負(fù)值(受內(nèi)核本身約束)1.1 Linux進(jìn)程間通信套接口v也稱套接字,用于不同機(jī)器之間的進(jìn)程間通信v通信域是用來說明套接口通信的協(xié)議,創(chuàng)建套接口時(shí)要指明它的通信域v常見的有:UNIX域套接口、網(wǎng)際通信域v系統(tǒng)的網(wǎng)絡(luò)編程接口,以文件的形式實(shí)現(xiàn)(屬于sockfs特殊文件系統(tǒng))1

5、.2 進(jìn)程軟中斷通信v即信號(hào),提供一種簡單的處理異步事件的方法v信號(hào)機(jī)制是對(duì)中斷機(jī)制的一種模擬,又稱為軟中斷v信號(hào)與中斷的相似點(diǎn)采用了相同的異步通信方式當(dāng)檢測(cè)出有信號(hào)或中斷請(qǐng)求時(shí),暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序處理完畢后返回到原來的斷點(diǎn)對(duì)信號(hào)或中斷可以進(jìn)行屏蔽v信號(hào)與中斷的區(qū)別中斷有優(yōu)先級(jí),而信號(hào)沒有優(yōu)先級(jí),所有的信號(hào)都是平等的信號(hào)處理程序在用戶態(tài)下運(yùn)行,而中斷處理程序在核心態(tài)下運(yùn)行中斷響應(yīng)是及時(shí)的,而信號(hào)響應(yīng)通常都有較大的時(shí)間延遲1.2 進(jìn)程軟中斷通信信號(hào)機(jī)制的功能v發(fā)送信號(hào)發(fā)送進(jìn)程把信號(hào)送到指定進(jìn)程信號(hào)域的某一位上,如目標(biāo)進(jìn)程正在一個(gè)可被中斷的優(yōu)先級(jí)上睡眠,核心便將其喚醒v預(yù)置

6、對(duì)信號(hào)的處理方式進(jìn)程處于核心態(tài)時(shí),即使受到軟中斷也不予理睬;只有當(dāng)它返回到用戶態(tài)后,才處理軟中斷信號(hào)v收受信號(hào)的進(jìn)程按事先規(guī)定完成對(duì)相應(yīng)事件的處理1.3 管道和消息隊(duì)列無名管道int pipe(int fd2);一般的文件I/O函數(shù)都可用v讀數(shù)據(jù)規(guī)則若管道的寫端不存在,讀出字節(jié)數(shù)為0寫端存在時(shí),若請(qǐng)求字節(jié)數(shù)大于PIPE_BUF,則返回管道中的現(xiàn)有數(shù)據(jù);否則返回請(qǐng)求的字節(jié)數(shù)v寫入規(guī)則不保證寫入的原子性,若有空閑區(qū)域,寫進(jìn)程就會(huì)試圖寫入管道,若讀進(jìn)程不讀走數(shù)據(jù),則寫操作將一直阻塞管道讀端存在時(shí),寫入數(shù)據(jù)才有意義;否則,寫進(jìn)程將收到內(nèi)核傳來的SIFPIP信號(hào),應(yīng)用程序處理該信號(hào)或忽略(默認(rèn)終止應(yīng)用程

7、序)1.3 管道和消息隊(duì)列命名管道(1)int mkfifo(const char * pathname, mode t_mode);v增加了打開操作:若當(dāng)前打開操作是為讀而打開,若已有進(jìn)程為寫而打開,則打開成功;否則,阻塞直到有相應(yīng)進(jìn)程為寫而打開(設(shè)置了阻塞標(biāo)識(shí)),或成功返回(未設(shè)置阻塞標(biāo)識(shí))若當(dāng)前打開操作是為寫而打開,若已有進(jìn)程為讀而打開,則打開成功;否則,阻塞直到有進(jìn)程為讀而打開(設(shè)置了阻塞標(biāo)識(shí)),或返回ENXIO錯(cuò)誤(未設(shè)置阻塞標(biāo)識(shí))1.3 管道和消息隊(duì)列命名管道(2)v約定:如果進(jìn)程為了從FIFO中讀取數(shù)據(jù)而阻塞打開FIFO,那么稱該進(jìn)程內(nèi)的讀操作為設(shè)置了阻塞標(biāo)志的讀操作 如果進(jìn)程為

8、了向FIFO中寫入數(shù)據(jù)而阻塞打開FIFO,那么稱該進(jìn)程內(nèi)的寫操作為設(shè)置了阻塞標(biāo)志的寫操作 v讀數(shù)據(jù)規(guī)則若有進(jìn)程寫打開FIFO,且當(dāng)前FIFO中無數(shù)據(jù),則對(duì)于設(shè)置了阻塞標(biāo)志的讀操作,將一直阻塞;對(duì)無阻塞標(biāo)志的讀操作則返回-1讀打開的阻塞標(biāo)志只對(duì)本進(jìn)程第一個(gè)讀操作施加作用,如果有多個(gè)讀操作序列,則在第一個(gè)讀操作被喚醒并完成后,后續(xù)的讀操作將不再阻塞如果沒有進(jìn)程寫打開,則設(shè)置了阻塞標(biāo)志的讀操作阻塞1.3 管道和消息隊(duì)列命名管道(3)v對(duì)于設(shè)置了阻塞標(biāo)志的寫操作:當(dāng)要寫入的數(shù)據(jù)量不大于PIPE_BUF時(shí),若管道空閑緩沖區(qū)不足以容納要寫入的字節(jié)數(shù),則睡眠,直到緩沖區(qū)滿足要求時(shí),一次性寫操作(原子性) 當(dāng)

9、要寫入的數(shù)據(jù)量大于PIPE_BUF時(shí),緩沖區(qū)一有空閑區(qū)域,寫進(jìn)程就會(huì)試圖寫入數(shù)據(jù),在寫完所有請(qǐng)求寫的數(shù)據(jù)后返回(非原子性) v對(duì)于沒有設(shè)置阻塞標(biāo)志的寫操作:當(dāng)要寫入的數(shù)據(jù)量大于PIPE_BUF時(shí),在寫滿所有FIFO空閑緩沖區(qū)后,寫操作返回(非原子性) 當(dāng)要寫入的數(shù)據(jù)量不大于PIPE_BUF時(shí),若當(dāng)前FIFO空閑緩沖區(qū)能夠容納請(qǐng)求寫入的字節(jié)數(shù),寫完后成功返回;若當(dāng)前FIFO空閑緩沖區(qū)不能容納請(qǐng)求寫入的字節(jié)數(shù),則返回EAGAIN錯(cuò)誤(原子性) 1.3 管道和消息隊(duì)列消息隊(duì)列v消息的鏈表,有寫權(quán)限的進(jìn)程可以向隊(duì)列中按照一定的規(guī)則添加新消息;有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀出信息v消息隊(duì)列是一個(gè)臨界

10、資源,讀寫操作必須互斥執(zhí)行v消息隊(duì)列獨(dú)立于發(fā)送和接收進(jìn)程,減少了在打開和關(guān)閉有名管道之間同步的困難v消息隊(duì)列的操作:打開或創(chuàng)建操作讀寫操作獲得或設(shè)置消息隊(duì)列屬性實(shí)驗(yàn)六 進(jìn)程間通信 v預(yù)備知識(shí)Linux進(jìn)程間通信進(jìn)程軟中斷通信管道和消息隊(duì)列v實(shí)驗(yàn)指導(dǎo)軟中斷通信函數(shù)管道通信的使用消息隊(duì)列的應(yīng)用v實(shí)驗(yàn)?zāi)康?、?nèi)容2.1 軟中斷通信函數(shù)(1)v向一個(gè)進(jìn)程或一組進(jìn)程發(fā)送一個(gè)信號(hào):int kill(pid, sig)pid0時(shí),核心將信號(hào)發(fā)送給進(jìn)程pidpid0時(shí),核心將信號(hào)發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程pid=-1時(shí),核心將信號(hào)發(fā)送給所有用戶標(biāo)識(shí)符真正等于發(fā)送進(jìn)程的有效用戶標(biāo)識(shí)號(hào)的進(jìn)程v預(yù)置信號(hào)接收后的處

11、理方式:signal(sig, function)function=1時(shí),屏蔽該類信號(hào)function=0時(shí),收到sig信號(hào)后終止自己function為非0、非1類整數(shù)時(shí),執(zhí)行用戶設(shè)置的軟中斷處理程序2.1 軟中斷通信函數(shù)(2)vpid_t wait(int * status)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來或子進(jìn)程結(jié)束vpid_t waitpid(pid_t pid, int * status, int options)pid的取值vpid=-1時(shí),等待任何一個(gè)子進(jìn)程退出,相當(dāng)于wait()vpid=0時(shí),等待進(jìn)程組ID與目前進(jìn)程相同的任何子進(jìn)程vpid-1時(shí),等待進(jìn)程組ID為pid絕對(duì)

12、值的任何子進(jìn)程options有兩個(gè)常數(shù)參數(shù),可使用或運(yùn)算,不用時(shí)設(shè)為0vWNOHANG:即使沒有任何子進(jìn)程退出,它也會(huì)立即返回vWUNTRACED:子進(jìn)程進(jìn)入暫停執(zhí)行狀態(tài)并馬上返回,但結(jié)束狀態(tài)不予以理會(huì)2.2 管道通信的使用無名管道的使用v將數(shù)據(jù)寫入管道:write()管道長度受到限制,管道滿時(shí)寫入操作將被阻塞,直到管道中的數(shù)據(jù)被讀取fcntl()可將管道設(shè)置為非阻塞模式v從管道讀取數(shù)據(jù):read()當(dāng)數(shù)據(jù)被讀取后,數(shù)據(jù)將自動(dòng)被管道清除不能由一個(gè)進(jìn)程向多個(gè)進(jìn)程同時(shí)傳遞同一個(gè)數(shù)據(jù)fcntl()可將管道讀模式設(shè)置為非阻塞模式v關(guān)閉管道:close()關(guān)閉讀端口時(shí),在管道上進(jìn)行寫操作的進(jìn)程將收到SI

13、GPIPE信號(hào)關(guān)閉寫端口時(shí),進(jìn)行讀操作的read()函數(shù)將返回02.2 管道通信的使用命名管道的創(chuàng)建與讀寫v創(chuàng)建命名管道:int mknod(const char *path, mode_t mod, dev_t dev);int mkfifo(const char *path, mode_t mode);v命名管道必須先調(diào)用open()將其打開同時(shí)用讀寫方式(O_RDWR)打開時(shí),一定不會(huì)導(dǎo)致阻塞 以只讀方式(O_RDONLY)打開時(shí),調(diào)用open()函數(shù)的進(jìn)程將會(huì)被阻塞直到有寫方打開管道 以寫方式(O_WRONLY)打開時(shí),阻塞直到有讀方打開管道 2.3 消息隊(duì)列的應(yīng)用v消息隊(duì)列的創(chuàng)建:m

14、sgget(key_t key, int msgflg);v消息的發(fā)送:msgsnd(int msgqid, const void *msgp_ptr, size_t msg_sz, int msgflg);v消息的接收:msgrcv(int msgqid, void *msgp_ptr, size_t msg_sz, long int msgtype, int msgflg);v消息隊(duì)列的控制和撤銷:msgctl(int msgqid, int cmd, struct msqid_ds *buf);實(shí)驗(yàn)六 進(jìn)程間通信 v預(yù)備知識(shí)Linux進(jìn)程間通信進(jìn)程軟中斷通信管道和消息隊(duì)列v實(shí)驗(yàn)指導(dǎo)軟中斷

15、通信函數(shù)管道通信的使用消息隊(duì)列的應(yīng)用v實(shí)驗(yàn)?zāi)康?、?nèi)容3.1 實(shí)驗(yàn)?zāi)康膙掌握Linux系統(tǒng)進(jìn)程軟中斷通信的基本原理和實(shí)現(xiàn)方法v了解管道通信的特點(diǎn),掌握管道通信的使用方法v了解消息隊(duì)列通信機(jī)制及原理,掌握消息隊(duì)列相關(guān)系統(tǒng)調(diào)用的使用方法及功能3.2 實(shí)驗(yàn)內(nèi)容(1)v進(jìn)程的信號(hào)通信編寫程序。用fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤的中斷信號(hào)(即按Del鍵);捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出下列信息后終止:Child process 1 is killed by parent.Child process 2 is killed by parent.父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下信息后終止:Parent process is killed.然后在程序中,增加語句signal(SIGINT, SIG_IGN)和語句signal(SIGQUIT, SIG_IGN),觀察執(zhí)行結(jié)果是否有變化,并分析原因。3.2 實(shí)驗(yàn)內(nèi)容(2)v進(jìn)程的管道通信編寫程序,實(shí)現(xiàn)進(jìn)程的管道通信:父進(jìn)程使用系統(tǒng)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論