進(jìn)程間通信問(wèn)題_第1頁(yè)
進(jìn)程間通信問(wèn)題_第2頁(yè)
進(jìn)程間通信問(wèn)題_第3頁(yè)
進(jìn)程間通信問(wèn)題_第4頁(yè)
進(jìn)程間通信問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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)介

13.5進(jìn)程間通信

(IPC,INTER-PROCESSCOMMUNICATION)3.5.1進(jìn)程間通信的類型3.5.2信號(hào)(signal)3.5.3共享存儲(chǔ)區(qū)(sharedmemory)3.5.4管道(pipe)3.5.5消息(message)3.5.6套接字(socket)23.5.1進(jìn)程間通信的類型低級(jí)通信:只能傳遞狀態(tài)和整數(shù)值(控制信息),包括進(jìn)程互斥和同步所采用的信號(hào)量和管程機(jī)制。優(yōu)點(diǎn)的速度快。缺點(diǎn)是:傳送信息量?。盒实?,每次通信傳遞的信息量固定,若傳遞較多信息則需要進(jìn)行多次通信。編程復(fù)雜:用戶直接實(shí)現(xiàn)通信的細(xì)節(jié),編程復(fù)雜,容易出錯(cuò)。高級(jí)通信:能夠傳送任意數(shù)量的數(shù)據(jù),包括三類:共享存儲(chǔ)區(qū)、管道、消息。返回1.低級(jí)通信和高級(jí)通信32.直接通信和間接通信直接通信:信息直接傳遞給接收方,如管道。在發(fā)送時(shí),指定接收方的地址或標(biāo)識(shí),也可以指定多個(gè)接收方或廣播式地址;在接收時(shí),允許接收來(lái)自任意發(fā)送方的消息,并在讀出消息的同時(shí)獲取發(fā)送方的地址。間接通信:借助于收發(fā)雙方進(jìn)程之外的共享數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊(duì)列。通常收方和發(fā)方的數(shù)目可以是任意的。43.高級(jí)通信的特征通信鏈路(communicationlink):點(diǎn)對(duì)點(diǎn)/多點(diǎn)/廣播單向/雙向有容量(鏈路帶緩沖區(qū))/無(wú)容量(發(fā)送方和接收方需自備緩沖區(qū))數(shù)據(jù)格式:字節(jié)流(bytestream):各次發(fā)送之間的分界,在接收時(shí)不被保留,沒(méi)有格式;報(bào)文(datagram/message):各次發(fā)送之間的分界,在接收時(shí)被保留,通常有格式(如表示類型),定長(zhǎng)/不定長(zhǎng)報(bào)文,可靠報(bào)文/不可靠報(bào)文。收發(fā)操作的同步方式發(fā)送阻塞(直到被鏈路容量或接收方所接受)和不阻塞(失敗時(shí)立即返回)接收阻塞(直到有數(shù)據(jù)可讀)和不阻塞(無(wú)數(shù)據(jù)時(shí)立即返回)由事件驅(qū)動(dòng)收發(fā):在允許發(fā)送或有數(shù)據(jù)可讀時(shí),才做發(fā)送和接收操作53.5.2信號(hào)(signal)3.5.2.1UNIX信號(hào)3.5.2.2WindowsNT信號(hào)返回信號(hào)相當(dāng)于給進(jìn)程的“軟件”中斷;進(jìn)程可發(fā)送信號(hào),指定信號(hào)處理例程;它是單向和異步的。63.5.2.1UNIX信號(hào)一個(gè)進(jìn)程向另一個(gè)進(jìn)程或進(jìn)程組(或自己)發(fā)送(kill系統(tǒng)調(diào)用):發(fā)送者必須具有接收者同樣的有效用戶ID,或者發(fā)送者是超級(jí)用戶身份某些鍵盤按鍵,如:中斷字符(通常是Ctrl+C或Del)、暫停字符(如Ctrl+Z)硬件條件,如:除數(shù)為零、浮點(diǎn)運(yùn)算錯(cuò)、訪問(wèn)非法地址等異常條件軟件條件,如:Socket中有加急數(shù)據(jù)到達(dá)。1.信號(hào)類型72.對(duì)信號(hào)的處理進(jìn)程可以設(shè)置信號(hào)處理例程(signal系統(tǒng)調(diào)用),在接收到信號(hào)時(shí)就被調(diào)用,稱為"捕獲"該信號(hào)。信號(hào)處理例程的參數(shù)是接收到信號(hào)的編號(hào)。進(jìn)程也可以忽略指定的信號(hào)(SIG_IGN)。只有SIGKILL信號(hào)(無(wú)條件終止進(jìn)程)和SIGSTOP(使進(jìn)程暫停)不能被忽略。在庫(kù)函數(shù)system()的實(shí)現(xiàn)中,通過(guò)fork和exec加載新程序之后,在父進(jìn)程中對(duì)SIGINT和SIGQUIT都要忽略,然后wait直到子進(jìn)程終止,才恢復(fù)對(duì)SIGINT和SIGQUIT的原有處理例程。進(jìn)程創(chuàng)建后為信號(hào)設(shè)立了默認(rèn)處理例程(SIG_DFL),如:終止并留映象文件(core)83.5.3共享存儲(chǔ)區(qū)(sharedmemory)創(chuàng)建或打開(kāi)共享存儲(chǔ)區(qū)(shmget):依據(jù)用戶給出的整數(shù)值key,創(chuàng)建新區(qū)或打開(kāi)現(xiàn)有區(qū),返回一個(gè)共享存儲(chǔ)區(qū)ID。連接共享存儲(chǔ)區(qū)(shmat):連接共享存儲(chǔ)區(qū)到本進(jìn)程的地址空間,可以指定虛擬地址或由系統(tǒng)分配,返回共享存儲(chǔ)區(qū)首地址。父進(jìn)程已連接的共享存儲(chǔ)區(qū)可被fork創(chuàng)建的子進(jìn)程繼承。拆除共享存儲(chǔ)區(qū)連接(shmdt):拆除共享存儲(chǔ)區(qū)與本進(jìn)程地址空間的連接。共享存儲(chǔ)區(qū)控制(shmctl):對(duì)共享存儲(chǔ)區(qū)進(jìn)行控制。如:共享存儲(chǔ)區(qū)的刪除需要顯式調(diào)用shmctl(shmid,IPC_RMID,0);相當(dāng)于內(nèi)存,可以任意讀寫和使用任意數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,對(duì)指針要注意),需要進(jìn)程互斥和同步的輔助來(lái)確保數(shù)據(jù)一致性1.UNIX的共享存儲(chǔ)區(qū)93.5.4管道(pipe)管道是一條在進(jìn)程間以字節(jié)流方式傳送的通信通道。它由OS核心的緩沖區(qū)(通常幾十KB)來(lái)實(shí)現(xiàn),是單向的;常用于命令行所指定的輸入輸出重定向和管道命令。在使用管道前要建立相應(yīng)的管道,然后才可使用。101.UNIX管道通過(guò)pipe系統(tǒng)調(diào)用創(chuàng)建無(wú)名管道,得到兩個(gè)文件描述符,分別用于寫和讀。intpipe(intfildes[2]);文件描述符fildes[0]為讀端,fildes[1]為寫端;通過(guò)系統(tǒng)調(diào)用write和read進(jìn)行管道的寫和讀;進(jìn)程間雙向通信,通常需要兩個(gè)管道;只適用于父子進(jìn)程之間或父進(jìn)程安排的各個(gè)子進(jìn)程之間;UNIX中的命名管道,可通過(guò)mknod系統(tǒng)調(diào)用建立:指定mode為S_IFIFOintmknod(constchar*path,mode_tmode,dev_tdev);11

寫端:fd[1]Write(fd[1],buf,size)

讀端:

fd[0]read(fd[0],buf,size)intpipe(intfd[2]);文件描述符fd[0]為讀端,fd[1]為寫端;管道工作原理如下:12管道通信實(shí)例用C語(yǔ)言編寫一個(gè)程序,建立一個(gè)pipe,同時(shí)父進(jìn)程生成一個(gè)子進(jìn)程,子進(jìn)程向pipe中寫入一字符串,父進(jìn)程從pipe中讀出該字符串。程序如下:#include<stdio.h>{intx,fd[2];charbuf[30],s[30];pipe(fd);/*創(chuàng)建管道*/while((x=fork())==-1);/*創(chuàng)建子進(jìn)程失敗,反復(fù)循環(huán)*/if(x==0){sprintf(buf,”Thisisanexample\n”);write(fd[1],buf,30);/*把buf中的字符寫入管道*/exit(0);}/*續(xù)左面*/else/*父進(jìn)程返回*/{wait(0);read(fd[0],s,30);/*父進(jìn)程讀管道字符*/printf(“%s”,s);}}133.5.5消息(message)與窗口系統(tǒng)中的“消息”不同。通常是不定長(zhǎng)數(shù)據(jù)塊。消息的發(fā)送不需要接收方準(zhǔn)備好,隨時(shí)可發(fā)送。14UNIX消息消息隊(duì)列(messagequeue):每個(gè)message不定長(zhǎng),由類型(type)和正文(text)組成UNIX消息隊(duì)列API:msgget依據(jù)用戶給出的整數(shù)值key,創(chuàng)建新消息隊(duì)列或打開(kāi)現(xiàn)有消息隊(duì)列,返回一個(gè)消息隊(duì)列ID;msgsnd發(fā)送消息;msgrcv接收消息,可以指定消息類型;沒(méi)有消息時(shí),返回-1;msgctl對(duì)消息隊(duì)列進(jìn)行控制,如刪除消息隊(duì)列;通過(guò)指定多種消息類型,可以在一個(gè)消息隊(duì)列中建立多個(gè)虛擬信道注意:消息隊(duì)列不隨創(chuàng)建它的進(jìn)程的終止而自動(dòng)撤銷,必須用msgctl(msgqid,IPC_RMID,0)。另外,msgget獲得消息隊(duì)列ID之后,fork創(chuàng)建子進(jìn)程,在子進(jìn)程中能否繼承該消息隊(duì)列ID而不必再一次msgget。153.5.6套接字(socket)雙向的,數(shù)據(jù)格式為字節(jié)流(一對(duì)一)或報(bào)文(多對(duì)一,一對(duì)多);主要用于網(wǎng)絡(luò)通信;支持client-server模式和peer-to-peer模

溫馨提示

  • 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)論