第8章 進(jìn)程間通信.ppt_第1頁(yè)
第8章 進(jìn)程間通信.ppt_第2頁(yè)
第8章 進(jìn)程間通信.ppt_第3頁(yè)
第8章 進(jìn)程間通信.ppt_第4頁(yè)
第8章 進(jìn)程間通信.ppt_第5頁(yè)
已閱讀5頁(yè),還剩66頁(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、第八章通過(guò)進(jìn)程間通信、8.1項(xiàng)目目標(biāo)8.2進(jìn)程間通信概述8.3管道通信8.4信號(hào)通信8.5信號(hào)量8.6共享存儲(chǔ)器8.7消息隊(duì)列8.8項(xiàng)目應(yīng)用、8.1項(xiàng)目目標(biāo)、本章學(xué)習(xí),掌握進(jìn)程間通信的常用方法。 經(jīng)過(guò)修訂以實(shí)現(xiàn)數(shù)據(jù)采集與顯示通信系統(tǒng)的中心數(shù)據(jù)采集過(guò)程與數(shù)據(jù)傳輸過(guò)程之間的數(shù)據(jù)通信。 本章的知識(shí)點(diǎn):在Linux系統(tǒng)中,同時(shí)存在多個(gè)進(jìn)程時(shí),這些異步進(jìn)程之間的通信問(wèn)題(數(shù)據(jù)和協(xié)作等)是必要的。 Linux提供管道、信號(hào)、消息隊(duì)列、共享內(nèi)存、信號(hào)量、套接字等通信機(jī)制。 本章將進(jìn)行詳細(xì)的學(xué)習(xí)。8.2進(jìn)程間通信概述、為什么需要進(jìn)程間通信、數(shù)據(jù)傳輸一個(gè)進(jìn)程需要將數(shù)據(jù)發(fā)送到另一個(gè)進(jìn)程、在共享資源的多個(gè)進(jìn)程之間共

2、享相同資源通知事件的一個(gè)進(jìn)程需要將消息發(fā)送到另一個(gè)進(jìn)程、一個(gè)進(jìn)程需要將消息發(fā)送到另一個(gè)進(jìn)程8.2概述進(jìn)程間通信、Linux上的進(jìn)程通信手段基本上從UNIX平臺(tái)上的進(jìn)程通信手段繼承。 對(duì)UNIX的發(fā)展有著重大貢獻(xiàn)的兩個(gè)主力AT,一旦創(chuàng)建了一個(gè)管道,就會(huì)創(chuàng)建兩個(gè)文件描述符。 filedis0用于讀取管道,filedis1用于寫入管道。 8.3.1關(guān)閉無(wú)名管道和管道,只需關(guān)閉兩個(gè)文件描述符即可。 可以使用常規(guī)的close函數(shù)逐個(gè)關(guān)閉。 無(wú)名流水線使用特征:只能用于具有親緣關(guān)系的進(jìn)程間通信(例如父子進(jìn)程)。 在半雙工通信模式下,固定的讀和寫管道可以視為特殊文件,其讀和寫可以使用普通的read和writ

3、e等函數(shù)。 但是,它只存在于內(nèi)核的內(nèi)存區(qū)域,而不是普通文件。8.3.1無(wú)名管路、# include # include # include int main () int pipe _ FD 2; if (pipe (pipe _ FD )0)打印機(jī)(pipecreateerrorn )。 返回- 1; 電子打印(管道創(chuàng)建成功); 克洛斯(pipe _ FD0); 克洛斯(pipe _ FD1); 8.3.1匿名管道和管道用于不同的進(jìn)程間通信,通常先創(chuàng)建管道,然后使用fork函數(shù)創(chuàng)建子進(jìn)程。 此子進(jìn)程繼承由父進(jìn)程創(chuàng)建的管道。8.3.1無(wú)名管道、子進(jìn)程寫入和父進(jìn)程讀取命名管道:8.3.1無(wú)名管道

4、、管道讀寫注意事項(xiàng)只有在管道讀取端存在時(shí),才向管道寫入數(shù)據(jù)是有意義的。 否則,向管道寫入數(shù)據(jù)的過(guò)程從內(nèi)核接收SIGPIPE信號(hào)。 向管道寫入數(shù)據(jù)時(shí),如果管道緩沖區(qū)中有空閑空間,寫入過(guò)程將嘗試向管道寫入數(shù)據(jù)。 如果讀取過(guò)程不從管道緩沖區(qū)讀取數(shù)據(jù),則寫入將被阻止。 父子進(jìn)程在運(yùn)行時(shí)不能保證優(yōu)先級(jí)。 可以使用sleep ()解析父子進(jìn)程,以確保關(guān)閉相應(yīng)的文件描述符。8.3.1匿名管道和管道讀取/寫入注意事項(xiàng)通過(guò)打開(kāi)兩個(gè)管道,可以創(chuàng)建雙向管道。 但是,必須在子進(jìn)程中正確設(shè)置文件描述符。 必須在系統(tǒng)調(diào)用fork ()之前調(diào)用pipe ()。 否則,子進(jìn)程將不會(huì)繼承文件描述符。 使用半雙工管道時(shí),相關(guān)進(jìn)程

5、必須共享相關(guān)的祖先進(jìn)程。 由于管道存在于系統(tǒng)內(nèi)核中,因此不能檢索在創(chuàng)建管道的進(jìn)程的祖先進(jìn)程中不存在的進(jìn)程。 在有名的管子里不是這樣的。 程序分析: pipe_rw.c工作:模仿半雙工管道程序?qū)懭p工管道程序,命名管道和無(wú)名管道基本相同,不同之處在于:無(wú)名管道只能使用父子工藝,但是通過(guò)給管道命名,不相關(guān)的工藝命名管道創(chuàng)建: # include # includeintmkfifo (const char * pathname,mode_t mode) pathname:FIFO文件名mode :屬性(請(qǐng)參見(jiàn)文件)8.3.2命名管道FIFO,8.3.2命名管道FIFO,對(duì)于要打開(kāi)以供讀取的管道,可

6、將open ()設(shè)置為O_RDONLY,對(duì)于要打開(kāi)以供寫入的管道,可將open ()設(shè)置為O_WRONLY 在管路的讀寫中有可能發(fā)生塊,這里的非塊標(biāo)志可以用open ()函數(shù)設(shè)為O_NONBLOCK。 在讀取過(guò)程中,如果此管道被阻止并打開(kāi),并且當(dāng)前FIFO中沒(méi)有數(shù)據(jù),則讀取過(guò)程將阻止它,直到有數(shù)據(jù)寫入。 如果此管道以無(wú)阻塞方式打開(kāi),則無(wú)論FIFO中是否有數(shù)據(jù),讀取過(guò)程都會(huì)立即執(zhí)行讀取操作。 也就是說(shuō),如果FIFO中沒(méi)有數(shù)據(jù),則讀取函數(shù)立即返回0。 命名8.3.2管道FIFO。 如果在寫入過(guò)程中管道被阻塞并打開(kāi),寫入將被阻塞直到數(shù)據(jù)被寫入。 如果此管道以無(wú)阻塞方式打開(kāi),并且無(wú)法寫入所有數(shù)據(jù),則會(huì)

7、部分寫入讀取操作或調(diào)用失敗。 像管道一樣,為了讀取而寫入未打開(kāi)的FIFO時(shí),生成信號(hào)SIGPIPE。 如果FIFO的最后一個(gè)寫入過(guò)程關(guān)閉了FIFO,則會(huì)為該FIFO的讀取過(guò)程生成文件結(jié)束標(biāo)志。 刪除管道:可以使用unlink函數(shù)刪除命名管道。 實(shí)例分析: fifo_write.c、fifo_read.c、8.3.2命名管道fifo、FIFO相關(guān)錯(cuò)誤消息: EACCES (無(wú)權(quán)限) EEXIST (指定文件不存在) ENAMETOOLONG (路徑名長(zhǎng)) ENOSPC (文件系統(tǒng)可用空間不足) ENOTDIR作為進(jìn)程間通信的機(jī)制,更重要的是,信號(hào)始終用于中斷進(jìn)程的正常運(yùn)行并處理更多異常。 信號(hào)是

8、異步的,過(guò)程不知道信號(hào)什么時(shí)候到達(dá)。 進(jìn)程可以處理信號(hào),也可以向特定進(jìn)程發(fā)送信號(hào)。 每個(gè)信號(hào)都有以SIG開(kāi)頭的名稱。 例如,SIGABRT是進(jìn)程異常終止信號(hào)。8.4管道通信,許多條件可以生成一個(gè)信號(hào):用戶按下特定終端鍵時(shí)生成信號(hào)。 在終端上按下Ctrl c鍵,通常會(huì)發(fā)生中斷信號(hào)(SIGINT )。 這是停止丟失的控制程序的方法。 硬件異常發(fā)生信號(hào):除數(shù)為0、無(wú)效的內(nèi)存訪問(wèn)等。 這些條件通常由硬件檢測(cè)并通知內(nèi)核。 然后,內(nèi)核會(huì)在條件發(fā)生時(shí)為正在運(yùn)行的進(jìn)程生成適當(dāng)?shù)男盘?hào)。 例如,將為執(zhí)行無(wú)效存儲(chǔ)訪問(wèn)的進(jìn)程生成SIGSEGV。 進(jìn)程可以使用kill(2)函數(shù)向另一進(jìn)程或進(jìn)程組發(fā)送信號(hào)。 當(dāng)然,也有接

9、收進(jìn)程和發(fā)送進(jìn)程的所有者必須相同,或者發(fā)送進(jìn)程的所有者必須是超級(jí)用戶的限制。8.4.2信號(hào)源,許多條件可生成一個(gè)信號(hào):用戶可用kill(1)命令向其他過(guò)程發(fā)送信號(hào)。 這個(gè)程序是kill函數(shù)的接口。 此命令通常會(huì)終止失控的后臺(tái)進(jìn)程。 檢測(cè)到發(fā)生任何軟件條件并將其通知相關(guān)進(jìn)程時(shí),也會(huì)生成信號(hào)。 這里,指的是軟件條件,而不是硬件生成條件(例如除以0 )。 例如,SIGURG (上傳網(wǎng)絡(luò)連接中未規(guī)定的波特率數(shù)據(jù))、SIGPIPE (在管道讀取過(guò)程結(jié)束后寫入該管道)和SIGALRM (由該過(guò)程設(shè)置的超時(shí)警報(bào)時(shí)間) 、8.4.2信號(hào)源、不可靠的信號(hào): Linux信號(hào)機(jī)制基本上從Unix系統(tǒng)繼承。 初始Un

10、ix系統(tǒng)中的信號(hào)機(jī)構(gòu)相對(duì)簡(jiǎn)單且原始,然后實(shí)際上由于暴露了一些問(wèn)題,在初始機(jī)構(gòu)中建立的信號(hào)被稱為“不可靠的信號(hào)”,并且信號(hào)值小于SIGRTMIN的不可靠信號(hào)(131 )。 每次處理信號(hào)時(shí),與該信號(hào)相對(duì)應(yīng)的處理函數(shù)都會(huì)變?yōu)槟J(rèn)值。 但是,現(xiàn)代的Linux經(jīng)過(guò)改進(jìn),信號(hào)處理函數(shù)始終由用戶指定或系統(tǒng)默認(rèn)。 有信號(hào)丟失的可能性。不可靠的信號(hào)不支持信號(hào)排隊(duì),同樣的信號(hào)多次發(fā)生,只要程序還沒(méi)有處理該信號(hào),實(shí)際上只處理一次該信號(hào)。8.4 .信號(hào)源、7.3.3信號(hào)類型、可靠信號(hào):信號(hào)值在SIGRTMIN和SIGRTMAX之間的信號(hào)都是可靠信號(hào),可靠信號(hào)克服了信號(hào)可能丟失的問(wèn)題。 實(shí)時(shí)信號(hào)和非實(shí)時(shí)信號(hào): Linu

11、x現(xiàn)在定義了64種信號(hào)(將來(lái)有可能擴(kuò)展),前32種是非實(shí)時(shí)信號(hào),后32種是實(shí)時(shí)信號(hào)。 非實(shí)時(shí)信號(hào)是不支持排隊(duì)且不可靠的信號(hào),實(shí)時(shí)信號(hào)是支持排隊(duì)并且可靠的信號(hào)。 信號(hào)隊(duì)列意味著無(wú)論發(fā)生多少次信號(hào),信號(hào)處理函數(shù)都會(huì)調(diào)用相同的次數(shù)。 7.3.3信號(hào)的種類、7.3.3信號(hào)的種類、7.3.3信號(hào)的種類、7.3.4信號(hào)的處理可以在系統(tǒng)出現(xiàn)某個(gè)信號(hào)時(shí)要求以下三種方式中的某一種進(jìn)行操作。 (1)無(wú)視該信號(hào)。 大多數(shù)信號(hào)可以用這種方式處理,但兩個(gè)信號(hào)不會(huì)被忽略。 SIGKILL和SIGSTOP兩種信號(hào)都不能忽略的原因是,為超級(jí)用戶提供了終止或停止進(jìn)程的可靠方法。 此外,如果忽略由硬件異常引起的信號(hào)(如非法的存儲(chǔ)

12、訪問(wèn)或除以0的信號(hào)),則不定義進(jìn)程的行為。 (2)捕捉信號(hào)。 為此,通知內(nèi)核在發(fā)生任何信號(hào)時(shí)調(diào)用用戶函數(shù)。 用戶函數(shù)允許用戶對(duì)這些事件執(zhí)行他們想要執(zhí)行的操作。 捕獲SIGCHLD信號(hào)表示子進(jìn)程已完成,因此該信號(hào)捕獲函數(shù)可以調(diào)用waitpID來(lái)獲取子進(jìn)程的進(jìn)程id及其完成狀態(tài)。 (3)執(zhí)行系統(tǒng)默認(rèn)動(dòng)作。 大多數(shù)信號(hào)的系統(tǒng)默認(rèn)行為是終止此過(guò)程。 7.3.4.1信號(hào)的處理缺省情況下,每個(gè)信號(hào)都有缺省行為。 這是當(dāng)進(jìn)程沒(méi)有為此信號(hào)指定處理程序時(shí)內(nèi)核對(duì)信號(hào)的處理。 有五個(gè)默認(rèn)的動(dòng)作。 異常終止(abort ) :在進(jìn)程的當(dāng)前目錄下,將進(jìn)程的地址空間內(nèi)容、寄存器內(nèi)容保存到名為core的文件中,終止進(jìn)程。

13、退出:直接退出進(jìn)程而不生成核心文件。 忽略:忽略該信號(hào)。 停止:停止進(jìn)程。 繼續(xù)(continue ) :如果進(jìn)程鎖定,則繼續(xù)執(zhí)行進(jìn)程。 否則,忽略信號(hào)。 7.3.4.2信號(hào)的處理捕獲。 當(dāng)系統(tǒng)捕獲信號(hào)時(shí),可以忽略信號(hào)、使用指定的處理函數(shù)處理信號(hào)或使用系統(tǒng)的默認(rèn)方法。 信號(hào)處理的主要方法有兩種。 一種方法是使用簡(jiǎn)單的signal函數(shù),另一種方法是使用信號(hào)集函數(shù)組。 (1)信號(hào)處理機(jī)制,# include void (*信號(hào),void (*函數(shù)) ) (int )返回: 如果發(fā)生錯(cuò)誤,則為SIG _ errtypedefvoid (* sighandler _ t ) (輸入)符號(hào)(輸入符號(hào)、符

14、號(hào)) (c )接收該信號(hào)后調(diào)用函數(shù)的地址:捕獲此信號(hào)稱為該信號(hào)。 該函數(shù)稱為“信號(hào)處理程序”(signal handler )或“信號(hào)捕獲函數(shù)”(signal-catching function )。在實(shí)例分析中,#包括#包括_函數(shù)(輸入符號(hào)_ no ) if (符號(hào)_ no=符號(hào))打印else if (符號(hào)_ no=符號(hào)quit )打印機(jī)int main ()打印機(jī)(waitingforsignalsignalsintorsigquitn )。 符號(hào),符號(hào),符號(hào); 信號(hào)(單位,我的函數(shù)); pause (); exit(0); (1)信號(hào)處理機(jī)構(gòu)將從終端CTRL C產(chǎn)生的信號(hào): # incl

15、ude # include int main ()信號(hào)忽略。 (1)休眠(1); 返回0; /程序執(zhí)行后,如果忽略來(lái)自Ctrl c的SIGINT信號(hào),則Ctrl c不能結(jié)束該過(guò)程,(1)Signal處理機(jī)構(gòu)接受信號(hào)的默認(rèn)處理,接受默認(rèn)處理是信號(hào)處理器# include # include #。 返回0; (1)信號(hào)處理機(jī)制,注意:信號(hào)主要采用前32種非實(shí)時(shí)信號(hào)處理信號(hào)不能傳送附加數(shù)據(jù)的信號(hào)處理機(jī)制,有些特殊情況注冊(cè)一個(gè)信號(hào)處理函數(shù),處理完畢后又發(fā)生了同樣類型的信號(hào)。 此時(shí),如果信號(hào)處理函數(shù)正在處理中,處理未完成,則會(huì)產(chǎn)生其他類型的信號(hào)。 這個(gè)時(shí)候,怎么處理好呢? (2)sigaction、Linux支持更加結(jié)實(shí)、更新的信號(hào)處理函數(shù)sigaction # include;const struct sigaction * act、struct sigaction *oldact ); 第一個(gè)signum指定需要處理(捕捉)的信號(hào)(SIGKILL和SIGSTOP除外)。 第二殘奧儀表act (結(jié)構(gòu))可以設(shè)置信號(hào)處理方案,而act可以為空。 先設(shè)定的信號(hào)處理方式保

溫馨提示

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