版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
5.1Linux下進(jìn)程間通信概述
Linux下的進(jìn)程間通信方式主要有:(1)管道(pipe)管道分為無名管道和有名管道,無名管道只能用于具有親緣關(guān)系進(jìn)程間的通信,允許一個進(jìn)程和另一個與它有共同祖先的進(jìn)程之間進(jìn)行通信,而有名管道除具有無名管道具有的功能外,還能用于無親屬關(guān)系的進(jìn)程間的通信。
(2)信號(signal)信號是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號給進(jìn)程本身。Linux除了支持Unix早期信號語義函數(shù)signal外,還支持語義符合Posix.1標(biāo)準(zhǔn)的信號函數(shù)sigaction。
(3)消息隊(duì)列消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列systemV消息隊(duì)列。它克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn),使具有寫權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,具有讀權(quán)限的進(jìn)程可以讀取隊(duì)列中的消息。
(4)共享內(nèi)存共享內(nèi)存是最有用的進(jìn)程間通信方式,它使得多個進(jìn)程可以訪問同一塊內(nèi)存空間。它往往需要與其它通信機(jī)制結(jié)合,如與信號量結(jié)合使用可實(shí)現(xiàn)進(jìn)程間的同步與互斥。
(5)內(nèi)存映射(mappedmemory)內(nèi)存映射允許任何多個進(jìn)程間通信,每一個使用該機(jī)制的進(jìn)程通過把一個共享的文件映射到自己的進(jìn)程地址空間來實(shí)現(xiàn)它。
(6)信號量(semaphore)主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
(7)套接字(socket)應(yīng)用更為廣泛的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。所有提供了TCP/IP協(xié)議棧的操作系統(tǒng)幾乎都提供了套接字,而所有這樣操作系統(tǒng),對套接字的編程方法幾乎是完全一樣的。
5.2管道通信5.2.1管道概述管道是Linux支持的最初UnixIPC形式之一,具有以下特點(diǎn):(1)管道是半雙工的通信模式,數(shù)據(jù)只能向一個方向流動。(2)只能用于具有親緣關(guān)系的進(jìn)程間的通信,即父子進(jìn)程或者兄弟進(jìn)程之間。(3)管道對于管道兩端的進(jìn)程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是單獨(dú)構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。
5.2.2管道創(chuàng)建與關(guān)閉創(chuàng)建管道可以通過調(diào)用pipe函數(shù)來實(shí)現(xiàn)。pipe函數(shù)的語法要點(diǎn)如下:頭文件:#include<unistd.h>函數(shù)原型:intpipe(intfd[2])
pipe函數(shù)通過傳入兩個文件描述符來創(chuàng)建管道,調(diào)用成功時返回0,否則返回-1。
5.2.3管道讀寫一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
5.2.4標(biāo)準(zhǔn)流管道系統(tǒng)提供了一個popen函數(shù)來完成標(biāo)準(zhǔn)流管道的一系列創(chuàng)建過程;
popen函數(shù)的使用可大大減少代碼的編寫量,但是創(chuàng)建管道時缺少靈活性,該函數(shù)只能支持標(biāo)準(zhǔn)的I/O函數(shù),不能使用read、write這類不帶緩沖的I/O函數(shù)。關(guān)閉標(biāo)準(zhǔn)流管道使用pclose函數(shù)來完成,該函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,并等待命令執(zhí)行結(jié)束。
5.2.5FIFO命名管道(namedpipes),因?yàn)檫@種管道的操作方式基于“先進(jìn)先出”原理,也稱為FIFO(FirstInFirstOut)在程序中調(diào)用mkfifo函數(shù)創(chuàng)建FIFO管道,mkfifo函數(shù)調(diào)用的原型為:
#include<sys/types.h>#include<sys/state.h>intmkfifo(constchar*filename,mode_tmode);
5.3信號機(jī)制5.3.1信號概述1.信號及信號來源信號是在軟件層次上對中斷機(jī)制的一種模擬,在原理上,一個進(jìn)程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的。信號事件的發(fā)生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發(fā)送信號的系統(tǒng)函數(shù)是kill、raise、alarm、setitimer和sigqueue函數(shù),軟件來源還包括一些非法運(yùn)算等操作。
2.信號的種類可以從兩個不同的分類角度對信號進(jìn)行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時間的關(guān)系上:實(shí)時信號與非實(shí)時信號。
3.進(jìn)程對信號的響應(yīng)進(jìn)程對信號的響應(yīng)有以下三種方式:(1)忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即SIGKILL和SIGSTOP。(2)捕捉信號,定義信號處理函數(shù),當(dāng)信號發(fā)生時,執(zhí)行相應(yīng)的處理函數(shù)。(3)執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認(rèn)操作。
5.3.2信號的發(fā)送1.kill()和raise()kill函數(shù)和kill系統(tǒng)命令一樣,可以發(fā)送信號給進(jìn)程或者進(jìn)程組。它不僅可以終止進(jìn)程,還可以向進(jìn)程發(fā)送其他信號。與kill函數(shù)不同,raise函數(shù)允許向其自身發(fā)送信號。kill函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intkill(pid_tpid,intsigno)
raise函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intraise(intsigno)
2.a(chǎn)larm()和pause()alarm函數(shù)可以在進(jìn)程中設(shè)置一個定時器,當(dāng)定時器指定的時間到達(dá)時,它就向進(jìn)程發(fā)送SIGALARM信號。一個進(jìn)程只有一個鬧鐘時間,如果在調(diào)用alarm之前已經(jīng)設(shè)置過鬧鐘時間,則新設(shè)置的鬧鐘時間會替代以前設(shè)置的鬧鐘時間。alarm函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<unistd.h>函數(shù)原型:unsignedintalarm(unsignedintseconds)
pause函數(shù)是用于將調(diào)用進(jìn)程掛起直至捕捉到信號為止,通??捎糜谂袛嘈盘柺欠褚训?。pause函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<unistd.h>函數(shù)原型:intpause(void)函數(shù)返回值:返回值為-1,并把error值設(shè)為EINTR。
3.sigqueue()sigqueue函數(shù)是比較新的發(fā)送信號系統(tǒng)調(diào)用,主要是針對實(shí)時信號提出的(當(dāng)然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intsigqueue(pid_tpid,intsigno,constunionsigvalval)
4.setitimer()sigqueue函數(shù)是比較新的發(fā)送信號系統(tǒng)調(diào)用,主要是針對實(shí)時信號提出的(當(dāng)然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<sys/time.h>函數(shù)原型:intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue))
5.3.3信號的處理Linux主要有兩個函數(shù)實(shí)現(xiàn)信號的處理:signal()、sigaction()。1.signal函數(shù)signal函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<signal.h>函數(shù)原型:void(*signal(intsignum,void(*handler)(int)))(int)
2.信號集函數(shù)組信號集被定義為一種數(shù)據(jù)類型:typedefstruct{unsignedlongsig[_NSIG_WORDS];
}sigset_t
信號集用來描述信號的集合,Linux所支持的所有信號可以全部或部分的出現(xiàn)在信號集中,主要與信號阻塞相關(guān)函數(shù)配合使用。
5.4共享內(nèi)存5.4.1共享內(nèi)存概述SystemV進(jìn)程間通信(IPC)包括3種機(jī)制:消息隊(duì)列、信號量、共享內(nèi)存。SystemV共享內(nèi)存把共享數(shù)據(jù)放在共享內(nèi)存區(qū)域,任何想要訪問該數(shù)據(jù)的進(jìn)程通過共享該內(nèi)存區(qū)域來獲得訪問權(quán)。SystemV共享內(nèi)存通過shmget獲得或創(chuàng)建一個IPC共享內(nèi)存區(qū)域,并返回相應(yīng)的標(biāo)識符。
5.4.2共享內(nèi)存的實(shí)現(xiàn)1.接口函數(shù)
SystemV為共享內(nèi)存主要定義了fork()、shmget()、shmat()、shmdt()和shmctl()幾個API接口函數(shù)fork函數(shù)用于生成一個鍵值:key_tkey;shmget函數(shù)用于創(chuàng)建(或者獲?。┮粋€由key鍵值指定的共享內(nèi)存對象;
shmat函數(shù)用于建立調(diào)用進(jìn)程與由標(biāo)識符shmid指定的共享內(nèi)存對象之間的連接,返回被映射的段地址;shmdt函數(shù)用于斷開調(diào)用進(jìn)程與共享內(nèi)存對象之間的連接;shmctl函數(shù)用于對已創(chuàng)建的共享內(nèi)存對象進(jìn)行查詢、設(shè)值、刪除等操作.2.實(shí)例
5.5消息隊(duì)列5.5.1消息隊(duì)列概述消息隊(duì)列就是一個消息的鏈表??梢园严⒖醋饕粋€記錄,具有特定的格式以及特定的優(yōu)先級。用戶可以從消息隊(duì)列中添加消息、讀取消息。
下圖說明了內(nèi)核與消息隊(duì)列是怎樣建立起聯(lián)系的。其中:structipc_idsmsg_ids是內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu);structmsg_queue是每個消息隊(duì)列的隊(duì)列頭。
5.5.2消息隊(duì)列的實(shí)現(xiàn)1.接口函數(shù)
SystemV為消息隊(duì)列的實(shí)現(xiàn)主要定義了msgget()、msgsnd()、msgrcv()和msgctl()幾個API接口函數(shù)msgget函數(shù)用于創(chuàng)建或打開消息隊(duì)列msgsnd函數(shù)用于發(fā)送消息msgrcv函數(shù)用于讀取消息msgctl函數(shù)用于對由msqid標(biāo)識的消息隊(duì)列執(zhí)行cmd操作
2.實(shí)例實(shí)例首先使用msgget函數(shù)創(chuàng)建一個新的消息隊(duì)列,接著使用msgsnd函數(shù)添加一個消息到消息隊(duì)列,然后使用msgrcv函數(shù)從消息隊(duì)列中讀取消息,最后使用msgctl函數(shù)刪除該消息隊(duì)列。
5.6信號量信號量用于保護(hù)系統(tǒng)中關(guān)鍵的代碼或者數(shù)據(jù)結(jié)構(gòu)。
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版互聯(lián)網(wǎng)醫(yī)療平臺運(yùn)營服務(wù)合同范本4篇
- 2025年銷售人員入職勞動合同標(biāo)準(zhǔn)范本
- 2024版工業(yè)園區(qū)物業(yè)管理委托合同
- 2025年度臨時醫(yī)療設(shè)施搭棚建設(shè)協(xié)議4篇
- 2025年度美容院客戶關(guān)系管理系統(tǒng)合作協(xié)議4篇
- 二零二五年度國際物流居間代理合同4篇
- 二零二五版魯佳離婚協(xié)議中個人債務(wù)清償及財產(chǎn)繼承安排4篇
- 二零二五年度文化場館承包合同范本4篇
- 二零二五年度基坑支護(hù)施工信息化管理與監(jiān)測合同3篇
- 2025年膩?zhàn)愉N售與客戶關(guān)系管理系統(tǒng)開發(fā)合同3篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長競聘演講稿(3篇)
- 2025至2031年中國臺式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報告
- 原發(fā)性腎病綜合征護(hù)理
- (一模)株洲市2025屆高三教學(xué)質(zhì)量統(tǒng)一檢測 英語試卷
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級上冊
- 2025年中國電科集團(tuán)春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 2024年考研英語一閱讀理解80篇解析
- 樣板間合作協(xié)議
評論
0/150
提交評論