進程間通信問題_第1頁
進程間通信問題_第2頁
進程間通信問題_第3頁
進程間通信問題_第4頁
進程間通信問題_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

13.5進程間通信

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論