《linux軟件工程師(C語言)實用教程》第7章_第1頁
《linux軟件工程師(C語言)實用教程》第7章_第2頁
《linux軟件工程師(C語言)實用教程》第7章_第3頁
《linux軟件工程師(C語言)實用教程》第7章_第4頁
《linux軟件工程師(C語言)實用教程》第7章_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第 7 章章進程間的通信進程間的通信2本章重點 q 進程通信中信號概念及信號處理q 進程間的管道通信編程q 進程間的內(nèi)存共享編程37.1.1 信號及其使用信號及其使用 q 信號是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。信號可以直接進行用戶空間進程和內(nèi)核進程之間的交互,內(nèi)核進程也可以利用它來通知用戶空間進程發(fā)生了哪些系統(tǒng)事件。q 信號事件的發(fā)生有兩個來源:q 硬件來源,如按下了鍵盤Delete鍵或者鼠標(biāo)單擊,通常產(chǎn)生中斷信號(SIGINT)或者其它硬件故障。 軟件來源,如使用系統(tǒng)調(diào)用或者是命令發(fā)出信號。最常用發(fā)送信號的系統(tǒng)函數(shù)是kill、raise、alarm、setitimer

2、、sigation和sigqueue函數(shù),軟件來源還包括一些非法運算等操作。47.1.1 信號及其使用信號及其使用q 例例7.1:列出系統(tǒng)所支持的所有信號列表。 (1)使用系統(tǒng)命令:rootlocalhost root#kill -l(2)分析:)分析:q SIG信號信號 q SIGRTMIN信號是從信號是從UNIX系統(tǒng)中繼承下來的稱為不可靠信號系統(tǒng)中繼承下來的稱為不可靠信號(也也稱為非實時信號稱為非實時信號)。q SIGRTMAX是為了解決前面是為了解決前面“不可靠信號不可靠信號”問題而進行更改和問題而進行更改和擴充的信號,稱為可靠信號擴充的信號,稱為可靠信號(也稱為實時信號也稱為實時信號)

3、。q 可靠信號可靠信號(實時信號實時信號):支持排隊,發(fā)送用戶進程一次就注冊一次,:支持排隊,發(fā)送用戶進程一次就注冊一次,發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,也要再注冊。發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,也要再注冊。q 不可靠信號不可靠信號(非實時信號非實時信號):不支持排隊,發(fā)送用戶進程判斷后注:不支持排隊,發(fā)送用戶進程判斷后注冊,發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,就不再注冊,忽略該信冊,發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,就不再注冊,忽略該信號。前面顯示的號。前面顯示的31種種“SIG”開頭的,也屬于非實時信號。開頭的,也屬于非實時信號。 57.1.1 信號及其使用信號及其使用q 一旦有信號產(chǎn)生,用戶進程對信

4、號的響應(yīng)有3種方式:q 執(zhí)行默認(rèn)操作。Linux對每種信號都規(guī)定了默認(rèn)操作。q 捕捉信號。定義信號處理函數(shù),當(dāng)信號發(fā)生時,執(zhí)行相應(yīng)的處理函數(shù)。 忽略信號。不希望接收到的信號對進程的執(zhí)行產(chǎn)生影響,而讓進程繼續(xù)進行時,可以忽略該信號,即不對信號進程任何處理。6常見信號的含義及其默認(rèn)操作77.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)87.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)1. 信號發(fā)送信號發(fā)送 信號發(fā)送的關(guān)鍵,是使系統(tǒng)知道向哪個進程發(fā)送以及發(fā)送什么信號。能否向某一進程發(fā)送某一特定信號是和用戶的權(quán)限密切相關(guān)的。 97.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)q例例7.2:設(shè)計一個程序

5、,要求用戶進程復(fù)制出一個子進程,父進程向子進程發(fā)出信號,子進程收到此信號,結(jié)束子進程。 q源程序代碼:編譯成功后,運行可執(zhí)行文件,編譯成功后,運行可執(zhí)行文件,此時系統(tǒng)會顯示子進程的進程號此時系統(tǒng)會顯示子進程的進程號(PID)、)、kill 函數(shù)的返回值和函數(shù)的返回值和SIGKILL信號所結(jié)束進程的進程信號所結(jié)束進程的進程號號(PID)。由此例可知,系統(tǒng)調(diào)用由此例可知,系統(tǒng)調(diào)用kill函數(shù)函數(shù)和和raise函數(shù),都是簡單地向某一函數(shù),都是簡單地向某一進程發(fā)送信號。進程發(fā)送信號。kill函數(shù)用于給函數(shù)用于給特定的進程或進程組發(fā)送信號,特定的進程或進程組發(fā)送信號,raise函數(shù)用于向一個進程自身發(fā)函

6、數(shù)用于向一個進程自身發(fā)送信號。送信號。107.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)117.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)2. 信號處理信號處理 當(dāng)某個信號被發(fā)送到一個正在運行的進程時,該進程即對此特定信號注冊相應(yīng)的信號處理函數(shù),以完成所需處理。 127.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)q例例7.3:設(shè)計一個程序,要求程序運行后進入無限循環(huán),當(dāng)用戶按下中斷鍵(Ctrl+C)時,進入程序的自定義信號處理函數(shù),當(dāng)用戶再次按下中斷鍵(Ctrl+C)后,結(jié)束程序運行。q源程序代碼 :signal函數(shù)主要用于前函數(shù)主要用于前31種非實種非實時信號的處理,不支持信號傳遞時信

7、號的處理,不支持信號傳遞信息信息(函數(shù)類型是函數(shù)類型是void),但使用,但使用簡單、方便,只需把要處理的信簡單、方便,只需把要處理的信號和處理函數(shù)列出即可,因此受號和處理函數(shù)列出即可,因此受到許多軟件工程師歡迎。到許多軟件工程師歡迎。137.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)147.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)3. 信號阻塞信號阻塞 有時既不希望進程在接收到信號時立刻中斷進程的執(zhí)行,也不希望此信號完全被忽略掉,而是延遲一段時間再去調(diào)用信號處理函數(shù),這個時候就需要信號阻塞來完成。157.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)q例例7.4:設(shè)計一個程序,要求程序主

8、體運行時,即使用戶按下的中斷鍵(Ctrl+C),也不能影響正在運行的程序,等程序主體運行完畢后才進入自定義信號處理函數(shù)。 q源程序代碼 :167.2.1 信號操作的相關(guān)函數(shù)信號操作的相關(guān)函數(shù)177.2 管道管道q 在Linux中,管道是一種特殊的文件,對一個進程來說,管道的寫入和讀取與一個普通文件沒有區(qū)別。q 在Linux系統(tǒng)中,管道用于兩個進程間的通信,這兩個進程要有同源性,即它們必須是最終由同一個進程所生成的進程。管道通信采用的是半雙工方式,即同一時間只允許單方向傳輸數(shù)據(jù)。q 管道是Linux支持的最初Unix IPC形式之一,具有以下特點: q 管道是半雙工的,數(shù)據(jù)只能向一個方向流動;需

9、要雙方通信時,需要建立起兩個管道; q 只能用于父子進程或者兄弟進程之間(具有親緣關(guān)系的進程); 單獨構(gòu)成一種獨立的文件系統(tǒng):管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是自立門戶,單獨構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。 187.2.1 低級管道操作低級管道操作q低級管道操作時,建立管道用pipe函數(shù),建立管道后Linux系統(tǒng)會同時為該進程建立2個文件描述符pipe_fd0和pipe_fd1。pipe_fd0用來從管道讀取數(shù)據(jù),pipe_fd1用來把數(shù)據(jù)寫入管道。197.2.1 低級管道操作低級管道操作q例例7.5:設(shè)計一個程序,要求創(chuàng)建一個管道,

10、復(fù)制進程,父進程往管道中寫入字符串,子進程從管道中讀取前輸出字符串。 q源程序代碼:207.2.1 低級管道操作低級管道操作217.2.2 高級管道操作高級管道操作q例例7.6:設(shè)計一個程序,要求用popen創(chuàng)建管道,實現(xiàn)“l(fā)s -l|grep 7-6”的功能。 q源程序代碼 :使用使用popen函數(shù)讀寫管道,實際函數(shù)讀寫管道,實際上也是調(diào)用上也是調(diào)用pipe函數(shù)建立一個管函數(shù)建立一個管道,再調(diào)用道,再調(diào)用fork函數(shù)建立子進程,函數(shù)建立子進程,接著會建立一個接著會建立一個shell環(huán)境,并在環(huán)境,并在這個這個shell環(huán)境中執(zhí)行參數(shù)指定的環(huán)境中執(zhí)行參數(shù)指定的進程。進程。227.2.2 高級管

11、道操作高級管道操作237.2.3 命名管道命名管道q若要在兩個不相關(guān)的進程之間用管道通信,需要用到命名管道FIFO。q命名管道FIFO是通過Linux系統(tǒng)中的文件進行通信。命名管道的創(chuàng)建一般用mkfifo函數(shù),創(chuàng)建成功后,就使用open、read、write等函數(shù)傳輸數(shù)據(jù)。247.2.3 命名管道命名管道q例例7.7:設(shè)計兩個程序,要求用命名管道FIFO,實現(xiàn)簡單的聊天功能。257.2.3 命名管道命名管道q源程序7-7zhang.c代碼:267.2.3 命名管道命名管道q7-7li.c程序代碼如下:277.2.3 命名管道命名管道qmkfifo函數(shù)說明 qmemset函數(shù)說明 287.3 消

12、息隊列消息隊列q消息隊列,就是一個消息的鏈表,是一系列保存在內(nèi)核中的消息的列表。用q消息隊列的優(yōu)勢:對每個消息指定特定消息類型,接收的時候不需要按隊列次序,而是可以根據(jù)自定義條件接收特定類型的消息。q可以把消息看作一個記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權(quán)限的進程可以按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀取消息。消息隊列的常用函數(shù)297.3 消息隊列消息隊列q例例7.8:設(shè)計一個程序,要求創(chuàng)建消息隊列,輸入的文字添加到消息隊列后,讀取隊列中的消息輸出。q源程序代碼:由此例可知,進程間通過消息隊由此例可知,進程間通過消息隊列通信,主要是創(chuàng)建或打開消

13、息列通信,主要是創(chuàng)建或打開消息隊列、添加消息、讀取消息和控隊列、添加消息、讀取消息和控制消息隊列這四種操作。制消息隊列這四種操作。30qftok函數(shù)說明 qmsgget函數(shù)說明 qmsgsnd函數(shù)說明 qmsgrcv函數(shù)說明 317.4 共享內(nèi)存共享內(nèi)存q共享內(nèi)存允許兩個或多個進程共享一給定的存儲區(qū),因為數(shù)據(jù)不需要來回復(fù)制,所以是最快的一種進程間通信機制。q共享內(nèi)存原理: 327.4 共享內(nèi)存共享內(nèi)存q共享內(nèi)存可以通過mmap()系統(tǒng)調(diào)用(特殊情況下還可以采用匿名映射)機制實現(xiàn),也可以通過系統(tǒng)V共享內(nèi)存機制實現(xiàn)。應(yīng)用接口和原理很簡單,內(nèi)部機制復(fù)雜。為了實現(xiàn)更安全通信,往往還與信號燈等同步機制共

14、同使用。q常用函數(shù) :337.4.1 mmap系統(tǒng)調(diào)用系統(tǒng)調(diào)用q例例7.9:設(shè)計一個程序,要求復(fù)制進程,父子進程通過匿名映射實現(xiàn)共享內(nèi)存。 q源程序代碼:使用特殊文件提供匿名內(nèi)存映射,使用特殊文件提供匿名內(nèi)存映射,適用于具有親緣關(guān)系的進程之間。適用于具有親緣關(guān)系的進程之間。一般而言,子進程單獨維護從父一般而言,子進程單獨維護從父進程繼承下來的一些變量。而進程繼承下來的一些變量。而mmap函數(shù)的返回地址,由父子函數(shù)的返回地址,由父子進程共同維護。進程共同維護。347.4.1 mmap系統(tǒng)調(diào)用系統(tǒng)調(diào)用qmmap函數(shù)說明 qmunmap函數(shù)說明 357.4.2 系統(tǒng)系統(tǒng)V共享內(nèi)存共享內(nèi)存q系統(tǒng)V共享

15、內(nèi)存指的是把所有共享數(shù)據(jù)放在共享內(nèi)存區(qū)域(IPC shared memory region),任何想要訪問該數(shù)據(jù)的進程都必須在本進程的地址空間新增一塊內(nèi)存區(qū)域,用來映射存放共享數(shù)據(jù)的物理內(nèi)存頁面。q系統(tǒng)V共享內(nèi)存是通過映射特殊文件系統(tǒng)shm中的文件實現(xiàn)進程間的共享內(nèi)存通信。 367.4.2 系統(tǒng)系統(tǒng)V共享內(nèi)存共享內(nèi)存q例例7.10:設(shè)計兩個程序,要求通過系統(tǒng)V共享內(nèi)存通信,一個程序?qū)懭胂到y(tǒng)V共享區(qū)域,另一個程序讀取系統(tǒng)V共享區(qū)域。q7-10write.c程序代碼: 377.4.2 系統(tǒng)系統(tǒng)V共享內(nèi)存共享內(nèi)存q7-10read.c程序代碼:387.4.2 系統(tǒng)系統(tǒng)V共享內(nèi)存共享內(nèi)存結(jié)論:q 系統(tǒng)

16、V共享內(nèi)存中的數(shù)據(jù),從來不寫入到實際磁盤文件中去;而通過mmap()映射普通文件實現(xiàn)的共享內(nèi)存通信可以指定何時將數(shù)據(jù)寫入磁盤文件中。q 系統(tǒng)V共享內(nèi)存是隨內(nèi)核持續(xù)的,即使所有訪問共享內(nèi)存的進程都已經(jīng)正常終止,共享內(nèi)存區(qū)仍然存在(除非顯式刪除共享內(nèi)存),在內(nèi)核重新引導(dǎo)之前,對該共享內(nèi)存區(qū)域的任何改寫操作都將一直保留。1. 通過調(diào)用mmap()映射普通文件進行進程間通信時,一定要注意考慮進程何時終止對通信的影響。而通過系統(tǒng)V共享內(nèi)存實現(xiàn)通信的進程則不然。397.4.2 系統(tǒng)系統(tǒng)V共享內(nèi)存共享內(nèi)存qshmget函數(shù)說明 qshmat函數(shù)說明 qshmdt函數(shù)說明 40思考與實驗思考與實驗q 設(shè)計一個程序,要求程序運行后進入一個無限循環(huán),當(dāng)用戶按下中斷鍵(Ctrl+Z)時,進入程序的自定義信號處理函數(shù),當(dāng)用戶再次按下中斷鍵(Ctrl+Z)后,結(jié)束程序運行。q 設(shè)計一個程序,要求程序主體運行時,即使用戶按下的中斷鍵(Ctrl+C),也不能影響正在運行的程序,等程序主體運行

溫馨提示

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

最新文檔

評論

0/150

提交評論