




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Linux環(huán)境進程間通信:管道及有名管道-電腦資料管道及有名管道在本系列序中作者概述了linux進程間通信的幾種主要手段,1、管道概述及相關API應用管道相關的關鍵概念管道是Linux支持的最初UnixIPC形式之一,具有以下特點:管道是半雙工的,數(shù)據(jù)只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);單獨構成一種獨立的文件系統(tǒng):管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是自立門戶,單獨構成一種文件系統(tǒng),并且只存在與內(nèi)存中。數(shù)據(jù)的讀出和寫入:一個進程向管道中寫的內(nèi)容被管道另一端的進程讀出。寫入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。管道的創(chuàng)建:#includeintpipe(intfd[2])該函數(shù)創(chuàng)建的管道的兩端處于一個進程中間,在實際應用中沒有太大意義,因此,一個進程在由pipe。創(chuàng)建管道后,一般再fork一個子進程,然后通過管道實現(xiàn)父子進程間的通信(因此也不難推出,只要兩個進程中存在親緣關系,這里的親緣關系指的是具有共同的祖先,都可以采用管道方式來進行通信)。L3管道的讀寫規(guī)則:管道兩端可分別用描述字fd[0]以及fd[l]來描述,需要注意的是,管道的兩端是固定了任務的。即一端只能用于讀,由描述字fd[O]表示,稱其為管道讀端;另一端則只能用于寫,由描述字fd[l]來表示,稱其為管道寫端。如果試圖從管道寫端讀取數(shù)據(jù),或者向管道讀端寫入數(shù)據(jù)都將導致錯誤發(fā)生。一般文件的1/()函數(shù)都可以用于管道,如close、read、write等等。從管道中讀取數(shù)據(jù):如果管道的寫端不存在,則認為已經(jīng)讀到了數(shù)據(jù)的末尾,讀函數(shù)返回的讀出字節(jié)數(shù)為0;當管道的寫端存在時,如果請求的字節(jié)數(shù)目大于PIPE_BUF,則返回管道中現(xiàn)有的數(shù)據(jù)字節(jié)數(shù),如果請求的字節(jié)數(shù)目不大于PTPE_BUF,則返回管道中現(xiàn)有數(shù)據(jù)字節(jié)數(shù)(此時,管道中數(shù)據(jù)量小于請求的數(shù)據(jù)量);或者返回請求的字節(jié)數(shù)(此時,管道中數(shù)據(jù)量不小于請求的數(shù)據(jù)量)。注:(PIPE_BUF在include/linux/limits.h中定義,不同的內(nèi)核版本可能會有所不同。Posix.1要求PTPE_BUF至少為512字節(jié),redhat7.2中為4096)。關于管道的讀規(guī)則驗證:向管道中寫入數(shù)據(jù):向管道中寫入數(shù)據(jù)時,linux將不保證寫入的原子性,管道緩沖區(qū)一有空閑區(qū)域,寫進程就會試圖向管道寫入數(shù)據(jù)。如果讀進程不讀走管道緩沖區(qū)中的數(shù)據(jù),那么寫操作將一直阻塞。注:只有在管道的讀端存在時,向管道中寫入數(shù)據(jù)才有意義。否則,向管道中寫入數(shù)據(jù)的進程將收到內(nèi)核傳來的SIFPIPE信號,應用程序可以處理該信號,也可以忽略(默認動作則是應用程序終止)。對管道的寫規(guī)則的驗證1:寫端對讀端存在的依賴性ftincludettincludemain(){intpipe_fd[2];pid_t則輸出結果為:Brokenpipe,原因就是該管道以及它的所有fork。產(chǎn)物的讀端都已經(jīng)被關閉。如果在父進程中保留讀端,即在寫完pipe后,再關閉父進程的讀端,也會正常寫入pipe,讀者可自己驗證一下該結論。因此,在向管道寫入數(shù)據(jù)時,至少應該存在某一個進程,其中管道讀端沒有被關閉,否則就會出現(xiàn)上述錯誤(管道斷裂,進程收到了SIGPIPE信號,默認動作是進程終止)對管道的寫規(guī)則的驗證2:linux不保證寫管道的原子性驗證#include#include#includemain(intargc結論:寫入數(shù)目小于4096時寫入是非原子的!如果把父進程中的兩次寫入字節(jié)數(shù)都改為5000,則很容易得出下面結論:寫入管道的數(shù)據(jù)量大于4096字節(jié)時,緩沖區(qū)的空閑空間將被寫入數(shù)據(jù)(補齊),直到寫完所有數(shù)據(jù)為止,如果沒有進程讀數(shù)據(jù),則一直阻塞。L4管道應用實例:實例一:用于shell管道可用于輸入輸出重定向,它將一個命令的輸出直接定向到另一個命令的輸入。比如,當在某個shell程序(Bourneshell或Cshell等)鍵入who|wc-l后,相應shell程序?qū)?chuàng)建who以及wc兩個進程和這兩個進程間的管道。考慮下面的命令行:運行結果見附一。IgrepSIGRTMIN運行結果如下:30)STGPWR31)SIGSYS32)SIGRTMTN33)SIGRTMIN+134)SIGRTMIN+235)SIGRTMIN實例二:用于具有親緣關系的進程間通信下面例子給出了管道的具體應用,父進程通過管道發(fā)送一些命令給子進程,子進程解析命令,并根據(jù)命令作相應處理。#include#includemain(){intpipefd[2];pidt1.5管道的局限性管道的主要局限性正體現(xiàn)在它的特點上:只支持單向數(shù)據(jù)流;只能用于具有親緣關系的進程之間;沒有名字;管道的緩沖區(qū)是有限的(管道制存在于內(nèi)存中,在管道創(chuàng)建時,為緩沖區(qū)分配一個頁面大小);2、有名管道概述及相關APT應用2.1有名管道相關的關鍵概念管道應用的一個重大限制是它沒有名字,因此,只能用于具有親緣關系的進程間通信,在有名管道程am通pipe或FIFO)提出后,該限制得到了克服。FIFO不同于管道之處在于它提供一個路徑名與之關聯(lián),以FIFO的文件形式存在于文件系統(tǒng)中。這樣,即使與FIFO的創(chuàng)建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創(chuàng)建進程之間),因此,通過FIFO不相關的進程也能交換數(shù)據(jù)。值得注意的是,F(xiàn)IFO嚴格遵循先進先出(firstinfirstout),對管道及FIFO的讀總是從開始處返回數(shù)據(jù),對它們的寫則把數(shù)據(jù)添加到末尾。它們不支持諸如IseekO等文件定位操作。2.2有名管道的創(chuàng)建#include#includeintmkfifo(constchar*pathname,modetmode)該函數(shù)的第一個參數(shù)是一個普通的路徑名,也就是創(chuàng)建后FIFO的名字,2.3有名管道的打開規(guī)則有名管道比管道多了一個打開操作:open。FIFO的打開規(guī)則:如果當前打開操作是為讀而打開FIFO時,若已經(jīng)有相應進程為寫而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為寫而打開該FIFO(當前打開操作設置了阻塞標志);或者,成功返回(當前打開操作沒有設置阻塞標志)。如果當前打開操作是為寫而打開FIFO時,如果已經(jīng)有相應進程為讀而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為讀而打開該FIFO(當前打開操作設置了阻塞標志);或者,返回ENXIO錯誤(當前打開操作沒有設置阻塞標志)。對打開規(guī)則的驗證參見附2。2.4有名管道的讀寫規(guī)則從FIFO中讀取數(shù)據(jù):約定:如果一個進程為了從FIFO中讀取數(shù)據(jù)而阻塞打開FIFO,那么稱該進程內(nèi)的讀操作為設置了阻塞標志的讀操作。如果有進程寫打開FIFO,且當前FIFO內(nèi)沒有數(shù)據(jù),則對于設置了阻塞標志的讀操作來說,將一直阻塞。對于沒有設置阻塞標志讀操作來說則返回T,當前errno值為EAGAIN,提醒以后再試。對于設置了阻塞標志的讀操作說,造成阻塞的原因有兩種:當前FIFO內(nèi)有數(shù)據(jù),但有其它進程在讀這些數(shù)據(jù);另外就是FIFO內(nèi)沒有數(shù)據(jù)。解阻塞的原因則是FIFO中有新的數(shù)據(jù)寫入,不論信寫入數(shù)據(jù)量的大小,也不論讀操作請求多少數(shù)據(jù)量。讀打開的阻塞標志只對本進程第一個讀操作施加作用,如果本進程內(nèi)有多個讀操作序列,則在第一個讀操作被喚醒并完成讀操作后,其它將要執(zhí)行的讀操作將不再阻塞,即使在執(zhí)行讀操作時,F(xiàn)IFO中沒有數(shù)據(jù)也一樣(此時,讀操作返回0)。如果沒有進程寫打開FTFO,則設置了阻塞標志的讀操作會阻塞。注:如果FIFO中有數(shù)據(jù),則設置了阻塞標志的讀操作不會因為FIFO中的字節(jié)數(shù)小于請求讀的字節(jié)數(shù)而阻塞,此時,讀操作會返回FIFO中現(xiàn)有的數(shù)據(jù)量。向FIFO中寫入數(shù)據(jù):約定:如果一個進程為了向FIFO中寫入數(shù)據(jù)而阻塞打開FIFO,那么稱該進程內(nèi)的寫操作為設置了阻塞標志的寫操作。對于設置了阻塞標志的寫操作:當要寫入的數(shù)據(jù)量不大于PIPE_BUF時,linux將保證寫入的原子性。如果此時管道空閑緩沖區(qū)不足以容納要寫入的字節(jié)數(shù),則進入睡眠,直到當緩沖區(qū)中能夠容納要寫入的字節(jié)數(shù)時,才開始進行一次性寫操作。當要寫入的數(shù)據(jù)量大于PIPE.BUF時,linux將不再保證寫入的原子性。FIFO緩沖區(qū)一有空閑區(qū)域,寫進程就會試圖向管道寫入數(shù)據(jù),寫操作在寫完所有請求寫的數(shù)據(jù)后返回。對于沒有設置阻塞標志的寫操作:當要寫入的數(shù)據(jù)量大于PIPE.BUF時,linux將不再保證寫入的原子性。在寫滿所有FIFO空閑緩沖區(qū)后,寫操作返回。當要寫入的數(shù)據(jù)量不大于PIPE_BUF時,linux將保證寫入的原子性。如果當前FIFO空閑緩沖區(qū)能夠容納請求寫入的字節(jié)數(shù),寫完后成功返回;如果當前FIFO空閑緩沖區(qū)不能夠容納請求寫入的字節(jié)數(shù),則返回EAGAIN錯誤,提醒以后再寫;對FIFO讀寫規(guī)則的驗證:下面提供了兩個對FIFO的讀寫程序,適當調(diào)節(jié)程序中的很少地方或者程序的命令行參數(shù)就可以對各種FIFO讀寫規(guī)則進行驗證。程序1:寫FIFO的程序#include#include#include#include程序應用說明:把讀程序編譯成兩個不同版本:阻塞讀版本:br以及非阻塞讀版本nbr把寫程序編譯成兩個四個版本:非阻塞且請求寫的字節(jié)數(shù)大于PTPE_BUF版本:nbwg非阻塞且請求寫的字節(jié)數(shù)不大于PIPE_BUF版本:版本nbw阻塞且請求寫的字節(jié)數(shù)大于PIPE.BUF版本:bwg阻塞且請求寫的字節(jié)數(shù)不大于PTPE_BUF版本:版本bw下面將使用br、nbr、w代替相應程序中的阻塞讀、非阻塞讀驗證阻塞寫操作:當請求寫入的數(shù)據(jù)量大于PIPE.BUF時的非原子性:nbrlOOObwg當請求寫入的數(shù)據(jù)量不大于PTPE_BUF時的原子性:nbrlOOObw驗證非阻塞寫操作:當請求寫入的數(shù)據(jù)量大于PIPE.BUF時的非原子性:nbrlOOOnbwg請求寫入的數(shù)據(jù)量不大于PIPE.BUF時的原子性:nbrlOOOnbw不管寫打開的阻塞標志是否設置,在請求寫入的字節(jié)數(shù)大于4096時,都不保證寫入的原子性。但二者有本質(zhì)區(qū)別:對于阻塞寫來說,寫操作在寫滿FIFO的空閑區(qū)域后,會一直等待,直到寫完所有數(shù)據(jù)為止,請求寫入的數(shù)據(jù)最終都會寫入FIFO;而非阻塞寫則在寫滿FIFO的空閑區(qū)域后,就返回(實際寫入的字節(jié)數(shù)),所以有些數(shù)據(jù)最終不能夠?qū)懭搿τ谧x操作的驗證則比較簡單,不再討論。2.5有名管道應用實例在驗證了相應的讀寫規(guī)則后,應用實例似乎就沒有必要了。小結:管道常用于兩個方面:(1)在shell中時常會用到管道(作為輸入輸入的重定向),在這種應用方式下,管道的創(chuàng)建對于用戶來說是透明的;(2)用于具有親緣關系的進程間通信,用戶自己創(chuàng)建管道,并完成讀寫操作。FIFO可以說是管道的推廣,克服了管道無名字的限制,使得無親緣關系的進程同樣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧品格活動策劃方案
- 暖場活動破冰活動方案
- 機構改名活動方案
- 景區(qū)狩獵活動方案
- 機電公司策劃方案
- 暑假防曬活動方案
- 機關干部春耕活動方案
- 林業(yè)八一活動方案
- 最佳聽眾活動方案
- 棗莊市五比五看活動方案
- 【MOOC】犯罪心理學-中南財經(jīng)政法大學 中國大學慕課MOOC答案
- 彩鋼瓦拆除施工方案
- 2024年11月江蘇南京市建鄴區(qū)政府購崗人員招聘12人備考題庫500題及答案解析
- 學校安保服務方案(技術方案)
- 人教版2024年六年級語文下冊期末考試摸底檢測
- 西南民族大學:人工智能賦能課程建設的邏輯與路徑
- 三兄弟分田地宅基地協(xié)議書范文
- 跨學科主題學習-美化校園 2024-2025學年七年級地理上冊新教材教學課件(人教版2024)
- 外研版初中英語1-6冊單詞表
- 江蘇省徐州市2023-2024學年八年級下學期期末數(shù)學試卷(含答案解解)
- 房地產(chǎn)開發(fā)股東權益維護
評論
0/150
提交評論