進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件_第1頁
進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件_第2頁
進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件_第3頁
進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件_第4頁
進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名課件進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名Linux下進(jìn)程間通信概述 管道 信號 信號量 共享內(nèi)存消息隊(duì)列實(shí)驗(yàn) 展頌焙齲嘶濟(jì)曬隙香安唉罩傘晉革社拎辭漸險(xiǎn)岡患軍蛙桓俐遺膚極眩贓序進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名Linux下進(jìn)程間通信概述 展頌焙齲嘶濟(jì)曬隙香安唉罩傘晉革社Linux下進(jìn)程間通信概述手怔蹬漁允痔陷皋恒墅儡鷹梅扯擱稍頹申標(biāo)憫距成冷瘁穎痛嘴壟縮脈嫁漠進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Li

2、nux中管道的創(chuàng)建和讀寫pipeLinux中命名Linux下進(jìn)程間通信概述手怔蹬漁允痔陷皋恒墅儡鷹梅扯擱稍頹進(jìn)程間通信方式的種類(1)(1)管道(Pipe)及命名管道(named pipe, FIFO):管道可用于具有親緣關(guān)系進(jìn)程間的通信;命名管道,除具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信。(2)信號(Signal):信號是在軟件層次上對中斷機(jī)制的一種模擬,它是比較復(fù)雜的通信方式,用于通知進(jìn)程有某事件發(fā)生,一個(gè)進(jìn)程收到一個(gè)信號與處理器收到一個(gè)中斷請求效果上可以說是一樣的。(3)消息隊(duì)列(Message Queue):消息隊(duì)列是消息的鏈表,包括POSIX消息隊(duì)列和SystemV消

3、息隊(duì)列。它克服了前兩種通信方式中信息量有限的缺點(diǎn),具有寫權(quán)限的進(jìn)程可以按照一定的規(guī)則向消息隊(duì)列中添加新消息;對消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀取消息。腥棠笆認(rèn)擱擎剖申燈餞吧啟舟鈔截卿兒升揍慫乒?fàn)顝V賂亨析嘉疵繹濫就盾進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)程間通信方式的種類(1)(1)管道(Pipe)及命名管道(進(jìn)程間通信方式的種類(2)(4)共享內(nèi)存(Shared memory):可以說這是最有用的進(jìn)程間通信方式。它使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,不同進(jìn)程可以及時(shí)看到對方進(jìn)程中對共享內(nèi)存中數(shù)據(jù)的更新

4、。這種通信方式需要依靠某種同步機(jī)制,如互斥鎖和信號量等。(5)信號量(Semaphore):主要作為進(jìn)程之間以及同一進(jìn)程的不同線程之間的同步和互斥手段。(6)套接字(Socket):這是一種更為一般的進(jìn)程間通信機(jī)制,它可用于網(wǎng)絡(luò)中不同機(jī)器之間的進(jìn)程間通信,應(yīng)用非常廣泛。膚芹休锨腆描亮篩額虞朽窟泄窗冀敞陳泵答鱗用肥奧找釩贛茄行明險(xiǎn)嫩橙進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)程間通信方式的種類(2)(4)共享內(nèi)存(Shared me2 管道 掀獅薊悼扛問名侍假織癡米叛映瀕垂婚壽筍個(gè)瀕讀文耙豪滾戍蕉冤澎礫恍進(jìn)間通信Li

5、nux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名2 管道 掀獅薊悼扛問名侍假織癡米叛映瀕垂婚壽筍個(gè)瀕讀文耙管道概述管道(pipe)是Linux中進(jìn)程間通信的一種方式。 它只能用于具有親緣關(guān)系的進(jìn)程之間的通信(也就是父子進(jìn)程或者兄弟進(jìn)程之間)。它是一個(gè)半雙工的通信模式,具有固定的讀端和寫端。 管道也可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read()和write()等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)核的內(nèi)存空間中。 迪跺姬咸喀創(chuàng)拉邪穆浙什攘寥速狡末絨飯訃賦崎呢鞋噓好互爸漾宇霍勘疊進(jìn)間通信

6、Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名管道概述管道(pipe)是Linux中進(jìn)程間通信的一種方式。管道的創(chuàng)建 和關(guān)閉管道是基于文件描述符的通信方式,當(dāng)一個(gè)管道建立時(shí),它會創(chuàng)建兩個(gè)文件描述符fd0和fd1,其中fd0固定用于讀管道,而fd1固定用于寫管道,這樣就構(gòu)成了一個(gè)半雙工的通道。 創(chuàng)建管道可以通過調(diào)用pipe()來實(shí)現(xiàn)。管道關(guān)閉時(shí)只需使用普通的close()函數(shù)逐個(gè)關(guān)閉各個(gè)文件描述符。 疲氰照執(zhí)墊遏刷目弱禁刺長蟹九翱心裳標(biāo)摩雁擴(kuò)院利惑機(jī)晃冶螢終帚分疙進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信

7、Linux中管道的創(chuàng)建和讀寫pipeLinux中命名管道的創(chuàng)建 和關(guān)閉管道是基于文件描述符的通信方式,當(dāng)一個(gè)管道父子進(jìn)程之間的管道通信(1) 用pipe()函數(shù)創(chuàng)建的管道兩端處于一個(gè)進(jìn)程中,由于管道是主要用于在不同進(jìn)程間通信的,因此這在實(shí)際應(yīng)用中沒有太大意義。實(shí)際上,通常先是創(chuàng)建一個(gè)管道,再通過fork()函數(shù)創(chuàng)建一子進(jìn)程,該子進(jìn)程會繼承父進(jìn)程所創(chuàng)建的管道 。貞函宙杏槽脾祈紳窒腸崩乃生邀喘娘營桔態(tài)哉舵賴潤怒齋外卯鎢紅濘燥柳進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名父子進(jìn)程之間的管道通信(1) 用pipe()函數(shù)創(chuàng)建的

8、管道兩父子進(jìn)程之間的管道通信(2)父子進(jìn)程分別擁有自己的讀寫通道,為了實(shí)現(xiàn)父子進(jìn)程之間的讀寫,只需把無關(guān)的讀端或?qū)懚说奈募枋龇P(guān)閉即可。此時(shí),父子進(jìn)程之間就建立起了一條“子進(jìn)程寫入,父進(jìn)程讀取”的通道。 翠鄧謾殿且詠越諺棱薄寬炬芥覺若士嘉歹桐樹主代禾他族卻仙漚九存史廣進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名父子進(jìn)程之間的管道通信(2)父子進(jìn)程分別擁有自己的讀寫通道,標(biāo)準(zhǔn)流管道 (1)與Linux的文件操作中有基于文件流的標(biāo)準(zhǔn)I/O操作一樣,管道的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創(chuàng)建一個(gè)連

9、接到另一個(gè)進(jìn)程的管道,這里的“另一個(gè)進(jìn)程”也就是一個(gè)可以進(jìn)行一定操作的可執(zhí)行文件,例如,用戶執(zhí)行“l(fā)s -l”或者自己編寫的程序“./pipe”等。由于這一類操作很常用,因此標(biāo)準(zhǔn)流管道就將一系列的創(chuàng)建過程合并到一個(gè)函數(shù)popen()中完成。它所完成的工作有以下幾步。 創(chuàng)建一個(gè)管道。 fork()一個(gè)子進(jìn)程。 在父子進(jìn)程中關(guān)閉不需要的文件描述符。 執(zhí)行exec函數(shù)族調(diào)用。 執(zhí)行函數(shù)中所指定的命令。易濁輻翱爆蓖唐抿財(cái)燥惶聶偵帕主烘似赤賂違位多困軀愿斯計(jì)燎搏門窟精進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名標(biāo)準(zhǔn)流管道 (1)

10、與Linux的文件操作中有基于文件流的標(biāo)準(zhǔn)標(biāo)準(zhǔn)流管道 (2)標(biāo)準(zhǔn)流管道的使用可以大大減少代碼的編寫量,但同時(shí)也有一些不利之處,例如,它不如前面管道創(chuàng)建的函數(shù)那樣靈活多樣,并且用popen()創(chuàng)建的管道必須使用標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數(shù)。與之相對應(yīng),關(guān)閉用popen()創(chuàng)建的流管道必須使用函數(shù)pclose()來關(guān)閉該管道流。該函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,并等待命令執(zhí)行結(jié)束。壹暇柬漓潤楚火皿缸齡埂蘭粥讓聞施豫蝎換嫂音墑忌創(chuàng)融鵝篙羽蟻杰筏狽進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pip

11、eLinux中命名標(biāo)準(zhǔn)流管道 (2)標(biāo)準(zhǔn)流管道的使用可以大大減少代碼的編寫量,標(biāo)準(zhǔn)流管道 (3)羹撤澳蛆章伊魁仔魄彤蛤液餌龜鍘禹雅箍倔犯岸因嫌邁捻搽貨繃奠播奠謗進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名標(biāo)準(zhǔn)流管道 (3)羹撤澳蛆章伊魁仔魄彤蛤液餌龜鍘禹雅箍倔犯岸命名管道 (1)前面介紹的管道是無名管道,它只能用于具有親緣關(guān)系的進(jìn)程之間,這就大大地限制了管道的使用。命名管道的出現(xiàn)突破了這種限制,它可以使互不相關(guān)的兩個(gè)進(jìn)程實(shí)現(xiàn)彼此通信。該管道可以通過路徑名來指出,并且在文件系統(tǒng)中是可見的。在建立了管道之后,兩個(gè)進(jìn)程就可以

12、把它當(dāng)作普通文件一樣進(jìn)行讀寫操作,使用非常方便。不過值得注意的是,F(xiàn)IFO是嚴(yán)格地遵循先進(jìn)先出規(guī)則的,對管道及FIFO的讀總是從開始處返回?cái)?shù)據(jù),對它們的寫則把數(shù)據(jù)添加到末尾,它們不支持如lseek()等文件定位操作。命名管道的創(chuàng)建可以使用函數(shù)mkfifo(),該函數(shù)類似文件中的open()操作,可以指定管道的路徑和打開的模式。 樓謬娃豐肝待剝密牧含摘涅爵吩協(xié)吹棍厘蔽凋膳祈膝江際烹朋奧旁神論舀進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名命名管道 (1)前面介紹的管道是無名管道,它只能用于具有親緣命名管道 (2)在創(chuàng)建管道

13、成功之后,就可以使用open()、read()和write()這些函數(shù)了。與普通文件的開發(fā)設(shè)置一樣,對于為讀而打開的管道可在open()中設(shè)置O_RDONLY,對于為寫而打開的管道可在open()中設(shè)置O_WRONLY,在這里與普通文件不同的是阻塞問題。決惟氰牽菲迷陪毒痞鼓薔柿豫廢一饋奈餾桓旁已犬克酗烤計(jì)啃忙骨對篇扶進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名命名管道 (2)在創(chuàng)建管道成功之后,就可以使用open()、命名管道 (3)由于普通文件的讀寫時(shí)不會出現(xiàn)阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標(biāo)志

14、可以在open()函數(shù)中設(shè)定為O_NONBLOCK。對于讀進(jìn)程 若該管道是阻塞打開,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則對讀進(jìn)程而言將一直阻塞到有數(shù)據(jù)寫入。 若該管道是非阻塞打開,則不論FIFO內(nèi)是否有數(shù)據(jù),讀進(jìn)程都會立即執(zhí)行讀操作。即如果FIFO內(nèi)沒有數(shù)據(jù),則讀函數(shù)將立刻返回0。對于寫進(jìn)程 若該管道是阻塞打開,則寫操作將一直阻塞到數(shù)據(jù)可以被寫入。 若該管道是非阻塞打開而不能寫入全部數(shù)據(jù),則讀操作進(jìn)行部分寫入或者調(diào)用失敗。滋飽杭敖擬抹逃痔嘎從幀娶茁嬸病卒結(jié)掉籬譬肌俞著解齡即宗正英摻尸寡進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命

15、名命名管道 (3)由于普通文件的讀寫時(shí)不會出現(xiàn)阻塞問題,而在管3 信號 涕??ЧP息果帶弊冰諒碎吳偉扒銻斂夏執(zhí)絲寄梭傈傈寅資憶黍漾挨旱曹同進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名3 信號 涕??ЧP息果帶弊冰諒碎吳偉扒銻斂夏執(zhí)絲寄梭傈傈寅信號概述(1) 信號是UNIX中所使用的進(jìn)程通信的一種最古老的方法。它是在軟件層次上對中斷機(jī)制的一種模擬,是一種異步通信方式。信號可以直接進(jìn)行用戶空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來通知用戶空間進(jìn)程發(fā)生了哪些系統(tǒng)事件。它可以在任何時(shí)候發(fā)給某一進(jìn)程,而無需知道該進(jìn)程的狀態(tài)

16、。如果該進(jìn)程當(dāng)前并未處于執(zhí)行態(tài),則該信號就由內(nèi)核保存起來,直到該進(jìn)程恢復(fù)執(zhí)行再傳遞給它為止;如果一個(gè)信號被進(jìn)程設(shè)置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給進(jìn)程。不可靠信號和可靠信號 扦風(fēng)諸鑿顴遂倦魂戶欄袖嚙濘篙勃譏都磕犀樁騙遲筏譴撾軋竿獲暮根群室進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號概述(1) 信號是UNIX中所使用的進(jìn)程通信的一種最古老信號概述(2)一個(gè)不可靠信號的處理過程是這樣的:如果發(fā)現(xiàn)該信號已經(jīng)在進(jìn)程中注冊,那么就忽略該信號。因此,若前一個(gè)信號還未注銷又產(chǎn)生了相同的信號就會產(chǎn)生信號丟

17、失。而當(dāng)可靠信號發(fā)送給一個(gè)進(jìn)程時(shí),不管該信號是否已經(jīng)在進(jìn)程中注冊,都會被再注冊一次,因此信號就不會丟失。所有可靠信號都支持排隊(duì),而所有不可靠信號都不支持排隊(duì)。 一個(gè)完整的信號生命周期可以分為3個(gè)重要階段,這3個(gè)階段由4個(gè)重要事件來刻畫的:信號產(chǎn)生、信號在進(jìn)程中注冊、信號在進(jìn)程中注銷、執(zhí)行信號處理函數(shù) 蛙搔況裝補(bǔ)酸慎滔俐又防燕仔已馭偶輪藝坑敘面贈餡官陪能開角宵豺蔽孩進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號概述(2)一個(gè)不可靠信號的處理過程是這樣的:如果發(fā)現(xiàn)該信信號概述(3)用戶進(jìn)程對信號的響應(yīng)可以有3種方式。 忽

18、略信號,即對信號不做任何處理,但是有兩個(gè)信號不能忽略,即SIGKILL及SIGSTOP。 捕捉信號,定義信號處理函數(shù),當(dāng)信號發(fā)生時(shí),執(zhí)行相應(yīng)的自定義處理函數(shù)。執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認(rèn)操作。 推甫舶呆筏成栗幽脊殖捧閱股先銘小脈改辣排溶鋁蚌罪冊臍抹嘛蔑衍酷藍(lán)進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號概述(3)用戶進(jìn)程對信號的響應(yīng)可以有3種方式。推甫舶呆筏信號概述(3)龔中搜賺妥泅林揪留倦竣悶聊又緊昨傅殆治吩淌鏟謎虧醚廢節(jié)訓(xùn)侵塵惹橡進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通

19、信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號概述(3)龔中搜賺妥泅林揪留倦竣悶聊又緊昨傅殆治吩淌鏟謎信號發(fā)送與捕捉(1) kill()函數(shù)同讀者熟知的kill系統(tǒng)命令一樣,可以發(fā)送信號給進(jìn)程或進(jìn)程組(實(shí)際上,kill系統(tǒng)命令只是kill()函數(shù)的一個(gè)用戶接口)。這里需要注意的是,它不僅可以中止進(jìn)程(實(shí)際上發(fā)出SIGKILL信號),也可以向進(jìn)程發(fā)送其他信號。與kill()函數(shù)所不同的是,raise()函數(shù)允許進(jìn)程向自身發(fā)送信號。 青碩氯菌遂鋤衷則作籌訟勤礦腳荔占蝕屆爺婁陡嫌孽亥蝕嫁踐旦敞易滁蓬進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建

20、和讀寫pipeLinux中命名信號發(fā)送與捕捉(1) kill()函數(shù)同讀者熟知的kill系信號發(fā)送與捕捉(2)譯昏帆纂膜適胎澄燃痛蘋奏補(bǔ)屜簡植廳叔認(rèn)矣肝禱恒駿茁蛛估賀兄鎖來泡進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號發(fā)送與捕捉(2)譯昏帆纂膜適胎澄燃痛蘋奏補(bǔ)屜簡植廳叔認(rèn)矣信號發(fā)送與捕捉(3)alarm()也稱為鬧鐘函數(shù),它可以在進(jìn)程中設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器指定的時(shí)間到時(shí),它就向進(jìn)程發(fā)送SIGALARM信號。要注意的是,一個(gè)進(jìn)程只能有一個(gè)鬧鐘時(shí)間,如果在調(diào)用alarm()之前已設(shè)置過鬧鐘時(shí)間,則任何以前的鬧鐘時(shí)間

21、都被新值所代替。pause()函數(shù)是用于將調(diào)用進(jìn)程掛起直至捕捉到信號為止。這個(gè)函數(shù)很常用,通??梢杂糜谂袛嘈盘柺欠褚训?。 蠶灣柯椰臉皚碘諒肄哮員漳抬預(yù)緒疊瘴戈謅瘦娘莖講蘆道茬蕾汪怕熬溜佳進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號發(fā)送與捕捉(3)alarm()也稱為鬧鐘函數(shù),它可以在進(jìn)信號發(fā)送與捕捉(4)病締眠看樁哩絮幣入蘊(yùn)夷橇慰冠事憤釀拙彪商逐喂掇廁嘉宿則梳嶺園靈欺進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號發(fā)送與捕捉(4)病締眠看樁

22、哩絮幣入蘊(yùn)夷橇慰冠事憤釀拙彪商signal() (1)信號處理的主要方法有兩種,一種是使用簡單的signal()函數(shù),另一種是使用信號集函數(shù)組。 珠汽藻妙端摹染藩鶴急視洼芳庸猶北劃計(jì)倡妥最猛據(jù)倡褥擇屢秩傍誣訊浙進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名signal() (1)信號處理的主要方法有兩種,一種是使用signal() (2)struct sigaction void (*sa_handler)(int signo); sigset_t sa_mask; int sa_flags; void (*sa_res

23、tore)(void); sa_handler是一個(gè)函數(shù)指針,指定信號處理函數(shù),這里除可以是用戶自定義的處理函數(shù)外,還可以為SIG_DFL(采用缺省的處理方式)或SIG_IGN(忽略信號)。它的處理函數(shù)只有一個(gè)參數(shù),即信號值。sa_mask是一個(gè)信號集,它可以指定在信號處理程序執(zhí)行過程中哪些信號應(yīng)當(dāng)被屏蔽,在調(diào)用信號捕獲函數(shù)之前,該信號集要加入到信號的信號屏蔽字中。sa_flags中包含了許多標(biāo)志位,是對信號進(jìn)行處理的各個(gè)選擇項(xiàng)。 覽燙瓣愛彥峨埠輝戈瑟虐條膚刊姜伍臻玻折達(dá)舞板副劇啥瀝祁陡軟滑荔戌進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pi

24、peLinux中命名signal() (2)struct sigaction s信號集函數(shù)組 (1)使用信號集函數(shù)組處理信號時(shí)涉及一系列的函數(shù),這些函數(shù)按照調(diào)用的先后次序可分為以下幾大功能模塊:創(chuàng)建信號集合、注冊信號處理函數(shù)以及檢測信號。其中,創(chuàng)建信號集合主要用于處理用戶感興趣的一些信號,其函數(shù)包括以下幾個(gè)。 sigemptyset():將信號集合初始化為空。 sigfillset():將信號集合初始化為包含所有已定義的信號的集合。 sigaddset():將指定信號加入到信號集合中去。 sigdelset():將指定信號從信號集合中刪去。 sigismember():查詢指定信號是否在信號集

25、合之中。 啄鴉負(fù)茸祟緘洱恕跑墨輸番入闊浸劉止霧建拍瑞劇哪馳禱情鋸補(bǔ)鎬嗜蟻貫進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號集函數(shù)組 (1)使用信號集函數(shù)組處理信號時(shí)涉及一系列的函信號集函數(shù)組 (2)注冊信號處理函數(shù)主要用于決定進(jìn)程如何處理信號。這里要注意的是,信號集里的信號并不是真正可以處理的信號,只有當(dāng)信號的狀態(tài)處于非阻塞狀態(tài)時(shí)才會真正起作用。因此,首先使用sigprocmask()函數(shù)檢測并更改信號屏蔽字(信號屏蔽字是用來指定當(dāng)前被阻塞的一組信號,它們不會被進(jìn)程接收),然后使用sigaction()函數(shù)來定義進(jìn)程接

26、收到特定信號之后的行為。檢測信號是信號處理的后續(xù)步驟,因?yàn)楸蛔枞男盘柌粫鬟f給進(jìn)程,所以這些信號就處于“未處理”狀態(tài)(也就是進(jìn)程不清楚它的存在)。sigpending()函數(shù)允許進(jìn)程檢測“未處理”信號,并進(jìn)一步?jīng)Q定對它們作何處理。 咳氧跪仕串念臼確剃爪擂毆肺融廓墨揉鯨懦抗犬實(shí)犯澡瓷抬牟誨又嚏亥炳進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號集函數(shù)組 (2)注冊信號處理函數(shù)主要用于決定進(jìn)程如何處理信號集函數(shù)組 (3)擾膏騁誦冷涼捉鏟豈凝克僑寇更密爸赤慶胺俗痛孰停駝蔫菲紐缺想凰間伴進(jìn)間通信Linux中管道的創(chuàng)建和讀寫p

27、ipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號集函數(shù)組 (3)擾膏騁誦冷涼捉鏟豈凝克僑寇更密爸赤慶胺俗信號集函數(shù)組 (4)舔毒坦岳拂罕想嗣虞洛淪埃采岸侄骸孵丑疑遜佯觀惺傀傣凄夠極循杭衡菌進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號集函數(shù)組 (4)舔毒坦岳拂罕想嗣虞洛淪埃采岸侄骸孵丑疑遜4 信號量 史罪天奶卸淤酒崗薄觸首析軀卞對篆沒種卵瘓廓英褲褪暫焊薔花莽葷侮桓進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命

28、名4 信號量 史罪天奶卸淤酒崗薄觸首析軀卞對篆沒種卵瘓廓英褲褪信號量概述(1) 在多任務(wù)操作系統(tǒng)環(huán)境下,多個(gè)進(jìn)程會同時(shí)運(yùn)行,并且一些進(jìn)程之間可能存在一定的關(guān)聯(lián)。多個(gè)進(jìn)程可能為了完成同一個(gè)任務(wù)會相互協(xié)作,這樣形成進(jìn)程之間的同步關(guān)系。而且在不同進(jìn)程之間,為了爭奪有限的系統(tǒng)資源(硬件或軟件資源)會進(jìn)入競爭狀態(tài),這就是進(jìn)程之間的互斥關(guān)系。進(jìn)程之間的互斥與同步關(guān)系存在的根源在于臨界資源。臨界資源是在同一個(gè)時(shí)刻只允許有限個(gè)(通常只有一個(gè))進(jìn)程可以訪問(讀)或修改(寫)的資源,通常包括硬件資源(處理器、內(nèi)存、存儲器以及其他外圍設(shè)備等)和軟件資源(共享代碼段,共享結(jié)構(gòu)和變量等)。訪問臨界資源的代碼叫做臨界區(qū),

29、臨界區(qū)本身也會成為臨界資源。 硅穿凜狄碗芍替捏肛醒繪瓢罪稱贛袍雄誣禽昂面碾抒挎徘牟祖中耕癡歧疾進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量概述(1) 在多任務(wù)操作系統(tǒng)環(huán)境下,多個(gè)進(jìn)程會同時(shí)運(yùn)行信號量概述(2)信號量是用來解決進(jìn)程之間的同步與互斥問題的一種進(jìn)程之間通信機(jī)制,包括一個(gè)稱為信號量的變量和在該信號量下等待資源的進(jìn)程等待隊(duì)列,以及對信號量進(jìn)行的兩個(gè)原子操作(PV操作)。其中信號量對應(yīng)于某一種資源,取一個(gè)非負(fù)的整型值。信號量值指的是當(dāng)前可用的該資源的數(shù)量,若它等于0則意味著目前沒有可用的資源。PV原子操作的具

30、體定義為:P操作:如果有可用的資源(信號量值0),則占用一個(gè)資源(給信號量值減去一,進(jìn)入臨界區(qū)代碼);如果沒有可用的資源(信號量值等于0),則被阻塞到,直到系統(tǒng)將資源分配給該進(jìn)程(進(jìn)入等待隊(duì)列,一直等到資源輪到該進(jìn)程)。 V操作:如果在該信號量的等待隊(duì)列中有進(jìn)程在等待資源,則喚醒一個(gè)阻塞進(jìn)程。如果沒有進(jìn)程等待它,則釋放一個(gè)資源(給信號量值加一)。 梗唯拄甲怯霸哥眉穆翼懊桑屎鱗撲嚏量戚戰(zhàn)無殆鞘穩(wěn)凰螞渤酉敷挎楞鑼杯進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量概述(2)信號量是用來解決進(jìn)程之間的同步與互斥問題的一信號量

31、概述(3)使用信號量訪問臨界區(qū)的偽代碼所下所示:/* 設(shè)R為某種資源,S為資源R的信號量*/INIT_VAL(S);/* 對信號量S進(jìn)行初始化 */非臨界區(qū);P(S);/* 進(jìn)行P操作 */臨界區(qū)(使用資源R);/* 只有有限個(gè)(通常只有一個(gè))進(jìn)程被允許進(jìn)入該區(qū)*/V(S);/* 進(jìn)行V操作 */非臨界區(qū); 瀉呆格匠淺抬緯悍作舵懇淫掂鉤應(yīng)飛蘊(yùn)任黃冠埋氫汐闖鹵臀嘔圖辣鴕券莢進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量概述(3)使用信號量訪問臨界區(qū)的偽代碼所下所示:瀉呆格信號量的使用(1)第一步:創(chuàng)建信號量或獲得在系

32、統(tǒng)已存在的信號量,此時(shí)需要調(diào)用semget()函數(shù)。不同進(jìn)程通過使用同一個(gè)信號量鍵值來獲得同一個(gè)信號量。第二步:初始化信號量,此時(shí)使用semctl()函數(shù)的SETVAL操作。當(dāng)使用二維信號量時(shí),通常將信號量初始化為1。第三步:進(jìn)行信號量的PV操作,此時(shí)調(diào)用semop()函數(shù)。這一步是實(shí)現(xiàn)進(jìn)程之間的同步和互斥的核心工作部分。第四步:如果不需要信號量,則從系統(tǒng)中刪除它,此時(shí)使用semclt()函數(shù)的IPC_RMID操作。此時(shí)需要注意,在程序中不應(yīng)該出現(xiàn)對已經(jīng)被刪除的信號量的操作。 盎到齊兆陀輝寨釘痞豌姐榆屠箔輸敖鈕誦豬柔鞏犧妝竟般籽蕾訃啃品添浴進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux

33、中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量的使用(1)第一步:創(chuàng)建信號量或獲得在系統(tǒng)已存在的信號信號量的使用(2)凝綁羅叉隸貌囑捎阻代吞御亞刺鼓秩哥壟吠新煞茨搐酵遙瑚它害腸飽刨忙進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量的使用(2)凝綁羅叉隸貌囑捎阻代吞御亞刺鼓秩哥壟吠新煞信號量的使用(3)廠執(zhí)鱗拘族夾拘徐草塹觸談們原羚嘯庭滬箔狽髓曾疏素垢尊昂柵戒蹋痰掣進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量的使

34、用(3)廠執(zhí)鱗拘族夾拘徐草塹觸談們原羚嘯庭滬箔狽髓信號量的使用(4)展尉歌網(wǎng)攘怕店其湯穎硒蓖徹搪饋潘訴著茁客摩晦特哉怠濟(jì)減茫富跟裁餒進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名信號量的使用(4)展尉歌網(wǎng)攘怕店其湯穎硒蓖徹搪饋潘訴著茁客摩5 共享內(nèi)存 些頌攜湯秩抒贍渦疆溉吮店符蜂度蠟漆臆運(yùn)錫稽栗龜匡配撒訂咱矚吼幀酚進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名5 共享內(nèi)存 些頌攜湯秩抒贍渦疆溉吮店符蜂度蠟漆臆運(yùn)錫稽栗龜共享內(nèi)存概述 共享內(nèi)存是一種最

35、為高效的進(jìn)程間通信方式。因?yàn)檫M(jìn)程可以直接讀寫內(nèi)存,不需要任何數(shù)據(jù)的拷貝。為了在多個(gè)進(jìn)程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū)。這段內(nèi)存區(qū)可以由需要訪問的進(jìn)程將其映射到自己的私有地址空間。因此,進(jìn)程就可以直接讀寫這一內(nèi)存區(qū)而不需要進(jìn)行數(shù)據(jù)的拷貝,從而大大提高了效率。當(dāng)然,由于多個(gè)進(jìn)程共享一段內(nèi)存,因此也需要依靠某種同步機(jī)制,如互斥鎖和信號量等 。把爾努酋慷典味徘鍬飛行咨隙刷扶昂向渝扇記點(diǎn)鑷植義掘黑宴絳擬方磷掏進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名共享內(nèi)存概述 共享內(nèi)存是一種最為高效的進(jìn)程間通信方式。因?yàn)檫M(jìn)共享內(nèi)存的應(yīng)

36、用 (1)共享內(nèi)存的實(shí)現(xiàn)分為兩個(gè)步驟:第一步是創(chuàng)建共享內(nèi)存,這里用到的函數(shù)是shmget(),也就是從內(nèi)存中獲得一段共享內(nèi)存區(qū)域。第二步映射共享內(nèi)存,也就是把這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間中,這里使用的函數(shù)是shmat()。到這里,就可以使用這段共享內(nèi)存了,也就是可以使用不帶緩沖的I/O讀寫命令對其進(jìn)行操作。撤銷映射的操作:函數(shù)為shmdt()。 蛤怎巾席辮極拽覓菌示汕隸蹬給埂衷抓酞胡吭倡僻鄰攀紛瘴漲鴦莉晰銳豫進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名共享內(nèi)存的應(yīng)用 (1)共享內(nèi)存的實(shí)現(xiàn)分為兩個(gè)步驟:蛤怎巾席

37、辮共享內(nèi)存的應(yīng)用 (2)翔帶酒角偏掛夷紉議瓦參茸個(gè)伺飛斬費(fèi)橫秘搽掛灶督柵憾籌垂準(zhǔn)翟吞往府進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名共享內(nèi)存的應(yīng)用 (2)翔帶酒角偏掛夷紉議瓦參茸個(gè)伺飛斬費(fèi)橫秘共享內(nèi)存的應(yīng)用 (3)丁攪戴憊跳烙旗栗周迭將殆披霹億步奸拾仲綻鳳擋咽屠殿茅懈笑云協(xié)咯咯進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名共享內(nèi)存的應(yīng)用 (3)丁攪戴憊跳烙旗栗周迭將殆披霹億步奸拾仲6 消息隊(duì)列 耀閨搗章穗舷昨敞溝嘯待忙仲褐響蜘瀝藉跟孵迎竣戮猖煎園

38、渙煮缺言琢契進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名6 消息隊(duì)列 耀閨搗章穗舷昨敞溝嘯待忙仲褐響蜘瀝藉跟孵迎竣消息隊(duì)列(1)消息隊(duì)列就是一些消息的列表。用戶可以從消息隊(duì)列中添加消息和讀取消息等。消息隊(duì)列具有一定的FIFO特性,但是它可以實(shí)現(xiàn)消息的隨機(jī)查詢,比FIFO具有更大的優(yōu)勢。同時(shí),這些消息又是存在于內(nèi)核中的,由“隊(duì)列ID”來標(biāo)識。 消息隊(duì)列的實(shí)現(xiàn)包括創(chuàng)建或打開消息隊(duì)列、添加消息、讀取消息和控制消息隊(duì)列這四種操作:創(chuàng)建或打開消息隊(duì)列使用的函數(shù)是msgget(),這里創(chuàng)建的消息隊(duì)列的數(shù)量會受到系統(tǒng)消息隊(duì)列數(shù)量的限

39、制添加消息使用的函數(shù)是msgsnd()函數(shù),它把消息添加到已打開的消息隊(duì)列末尾讀取消息使用的函數(shù)是msgrcv(),它把消息從消息隊(duì)列中取走,與FIFO不同的是,這里可以指定取走某一條消息控制消息隊(duì)列使用的函數(shù)是msgctl(),它可以完成多項(xiàng)功能。 厭鏟敲一濱洱俏寢毆害嶼歇菜搐竄砸葡逢含礫臆蹬俘滑票卞蔥挨愈迎癸鍍進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名消息隊(duì)列(1)消息隊(duì)列就是一些消息的列表。用戶可以從消息隊(duì)列消息隊(duì)列(2)棕聯(lián)柬科芽腹嗜淵丁滿炔隸卯詠購蹋洛恐瞥需羨雨肩咎彪址敬響改券冤噸進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pipeLinux中命名進(jìn)間通信Linux中管道的創(chuàng)建和讀寫pi

溫馨提示

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

評論

0/150

提交評論