版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5.1Linux下進(jìn)程間通信概述
Linux下的進(jìn)程間通信方式主要有:(1)管道(pipe)管道分為無名管道和有名管道,無名管道只能用于具有親緣關(guān)系進(jìn)程間的通信,允許一個(gè)進(jìn)程和另一個(gè)與它有共同祖先的進(jìn)程之間進(jìn)行通信,而有名管道除具有無名管道具有的功能外,還能用于無親屬關(guān)系的進(jìn)程間的通信。
(2)信號(hào)(signal)信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身。Linux除了支持Unix早期信號(hào)語義函數(shù)signal外,還支持語義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction。
(3)消息隊(duì)列消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列systemV消息隊(duì)列。它克服了信號(hào)承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn),使具有寫權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,具有讀權(quán)限的進(jìn)程可以讀取隊(duì)列中的消息。
(4)共享內(nèi)存共享內(nèi)存是最有用的進(jìn)程間通信方式,它使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間。它往往需要與其它通信機(jī)制結(jié)合,如與信號(hào)量結(jié)合使用可實(shí)現(xiàn)進(jìn)程間的同步與互斥。
(5)內(nèi)存映射(mappedmemory)內(nèi)存映射允許任何多個(gè)進(jìn)程間通信,每一個(gè)使用該機(jī)制的進(jìn)程通過把一個(gè)共享的文件映射到自己的進(jìn)程地址空間來實(shí)現(xiàn)它。
(6)信號(hào)量(semaphore)主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
(7)套接字(socket)應(yīng)用更為廣泛的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。所有提供了TCP/IP協(xié)議棧的操作系統(tǒng)幾乎都提供了套接字,而所有這樣操作系統(tǒng),對(duì)套接字的編程方法幾乎是完全一樣的。
5.2管道通信5.2.1管道概述管道是Linux支持的最初UnixIPC形式之一,具有以下特點(diǎn):(1)管道是半雙工的通信模式,數(shù)據(jù)只能向一個(gè)方向流動(dòng)。(2)只能用于具有親緣關(guān)系的進(jìn)程間的通信,即父子進(jìn)程或者兄弟進(jìn)程之間。(3)管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但它不是普通的文件,它不屬于某種文件系統(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ù)通過傳入兩個(gè)文件描述符來創(chuàng)建管道,調(diào)用成功時(shí)返回0,否則返回-1。
5.2.3管道讀寫一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
5.2.4標(biāo)準(zhǔn)流管道系統(tǒng)提供了一個(gè)popen函數(shù)來完成標(biāo)準(zhǔn)流管道的一系列創(chuàng)建過程;
popen函數(shù)的使用可大大減少代碼的編寫量,但是創(chuàng)建管道時(shí)缺少靈活性,該函數(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信號(hào)機(jī)制5.3.1信號(hào)概述1.信號(hào)及信號(hào)來源信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說是一樣的。信號(hào)是異步的。信號(hào)事件的發(fā)生有兩個(gè)來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發(fā)送信號(hào)的系統(tǒng)函數(shù)是kill、raise、alarm、setitimer和sigqueue函數(shù),軟件來源還包括一些非法運(yùn)算等操作。
2.信號(hào)的種類可以從兩個(gè)不同的分類角度對(duì)信號(hào)進(jìn)行分類:(1)可靠性方面:可靠信號(hào)與不可靠信號(hào);(2)與時(shí)間的關(guān)系上:實(shí)時(shí)信號(hào)與非實(shí)時(shí)信號(hào)。
3.進(jìn)程對(duì)信號(hào)的響應(yīng)進(jìn)程對(duì)信號(hào)的響應(yīng)有以下三種方式:(1)忽略信號(hào),即對(duì)信號(hào)不做任何處理,但是有兩個(gè)信號(hào)不能忽略,即SIGKILL和SIGSTOP。(2)捕捉信號(hào),定義信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的處理函數(shù)。(3)執(zhí)行缺省操作,Linux對(duì)每種信號(hào)都規(guī)定了默認(rèn)操作。
5.3.2信號(hào)的發(fā)送1.kill()和raise()kill函數(shù)和kill系統(tǒng)命令一樣,可以發(fā)送信號(hào)給進(jìn)程或者進(jìn)程組。它不僅可以終止進(jìn)程,還可以向進(jìn)程發(fā)送其他信號(hào)。與kill函數(shù)不同,raise函數(shù)允許向其自身發(fā)送信號(hào)。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è)置一個(gè)定時(shí)器,當(dāng)定時(shí)器指定的時(shí)間到達(dá)時(shí),它就向進(jìn)程發(fā)送SIGALARM信號(hào)。一個(gè)進(jìn)程只有一個(gè)鬧鐘時(shí)間,如果在調(diào)用alarm之前已經(jīng)設(shè)置過鬧鐘時(shí)間,則新設(shè)置的鬧鐘時(shí)間會(huì)替代以前設(shè)置的鬧鐘時(shí)間。alarm函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<unistd.h>函數(shù)原型:unsignedintalarm(unsignedintseconds)
pause函數(shù)是用于將調(diào)用進(jìn)程掛起直至捕捉到信號(hào)為止,通??捎糜谂袛嘈盘?hào)是否已到。pause函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<unistd.h>函數(shù)原型:intpause(void)函數(shù)返回值:返回值為-1,并把error值設(shè)為EINTR。
3.sigqueue()sigqueue函數(shù)是比較新的發(fā)送信號(hào)系統(tǒng)調(diào)用,主要是針對(duì)實(shí)時(shí)信號(hào)提出的(當(dāng)然也支持前32種),支持信號(hào)帶有參數(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ā)送信號(hào)系統(tǒng)調(diào)用,主要是針對(duì)實(shí)時(shí)信號(hào)提出的(當(dāng)然也支持前32種),支持信號(hào)帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<sys/time.h>函數(shù)原型:intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue))
5.3.3信號(hào)的處理Linux主要有兩個(gè)函數(shù)實(shí)現(xiàn)信號(hào)的處理:signal()、sigaction()。1.signal函數(shù)signal函數(shù)相關(guān)語法要點(diǎn):頭文件:#include<signal.h>函數(shù)原型:void(*signal(intsignum,void(*handler)(int)))(int)
2.信號(hào)集函數(shù)組信號(hào)集被定義為一種數(shù)據(jù)類型:typedefstruct{unsignedlongsig[_NSIG_WORDS];
}sigset_t
信號(hào)集用來描述信號(hào)的集合,Linux所支持的所有信號(hào)可以全部或部分的出現(xiàn)在信號(hào)集中,主要與信號(hào)阻塞相關(guān)函數(shù)配合使用。
5.4共享內(nèi)存5.4.1共享內(nèi)存概述SystemV進(jìn)程間通信(IPC)包括3種機(jī)制:消息隊(duì)列、信號(hào)量、共享內(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)建一個(gè)IPC共享內(nèi)存區(qū)域,并返回相應(yīng)的標(biāo)識(shí)符。
5.4.2共享內(nèi)存的實(shí)現(xiàn)1.接口函數(shù)
SystemV為共享內(nèi)存主要定義了fork()、shmget()、shmat()、shmdt()和shmctl()幾個(gè)API接口函數(shù)fork函數(shù)用于生成一個(gè)鍵值:key_tkey;shmget函數(shù)用于創(chuàng)建(或者獲?。┮粋€(gè)由key鍵值指定的共享內(nèi)存對(duì)象;
shmat函數(shù)用于建立調(diào)用進(jìn)程與由標(biāo)識(shí)符shmid指定的共享內(nèi)存對(duì)象之間的連接,返回被映射的段地址;shmdt函數(shù)用于斷開調(diào)用進(jìn)程與共享內(nèi)存對(duì)象之間的連接;shmctl函數(shù)用于對(duì)已創(chuàng)建的共享內(nèi)存對(duì)象進(jìn)行查詢、設(shè)值、刪除等操作.2.實(shí)例
5.5消息隊(duì)列5.5.1消息隊(duì)列概述消息隊(duì)列就是一個(gè)消息的鏈表。可以把消息看作一個(gè)記錄,具有特定的格式以及特定的優(yōu)先級(jí)。用戶可以從消息隊(duì)列中添加消息、讀取消息。
下圖說明了內(nèi)核與消息隊(duì)列是怎樣建立起聯(lián)系的。其中:structipc_idsmsg_ids是內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu);structmsg_queue是每個(gè)消息隊(duì)列的隊(duì)列頭。
5.5.2消息隊(duì)列的實(shí)現(xiàn)1.接口函數(shù)
SystemV為消息隊(duì)列的實(shí)現(xiàn)主要定義了msgget()、msgsnd()、msgrcv()和msgctl()幾個(gè)API接口函數(shù)msgget函數(shù)用于創(chuàng)建或打開消息隊(duì)列msgsnd函數(shù)用于發(fā)送消息msgrcv函數(shù)用于讀取消息msgctl函數(shù)用于對(duì)由msqid標(biāo)識(shí)的消息隊(duì)列執(zhí)行cmd操作
2.實(shí)例實(shí)例首先使用msgget函數(shù)創(chuàng)建一個(gè)新的消息隊(duì)列,接著使用msgsnd函數(shù)添加一個(gè)消息到消息隊(duì)列,然后使用msgrcv函數(shù)從消息隊(duì)列中讀取消息,最后使用msgctl函數(shù)刪除該消息隊(duì)列。
5.6信號(hào)量信號(hào)量用于保護(hù)系統(tǒng)中關(guān)鍵的代碼或者數(shù)據(jù)結(jié)構(gòu)。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年倉庫安全管理責(zé)任協(xié)議(倉管員崗位)3篇
- 二零二五版2025年度駕校場(chǎng)地停車場(chǎng)改造施工服務(wù)協(xié)議3篇
- 2025年度場(chǎng)監(jiān)管法律事務(wù)合作協(xié)議4篇
- 二零二五年金融財(cái)務(wù)顧問項(xiàng)目合作協(xié)議2篇
- 2025年度新能源電池組裝與測(cè)試合作協(xié)議4篇
- 2025版農(nóng)田水利工程質(zhì)量檢測(cè)與驗(yàn)收合同3篇
- 2025年度工業(yè)廠房改造項(xiàng)目投資合作合同范文4篇
- 2025年度碼頭集裝箱堆場(chǎng)租賃與維護(hù)服務(wù)協(xié)議4篇
- 2025年物業(yè)管理公司專業(yè)聘用人員服務(wù)合同3篇
- 二零二五版戶外拓展訓(xùn)練培訓(xùn)課程研發(fā)與銷售服務(wù)協(xié)議3篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長(zhǎng)競(jìng)聘演講稿(3篇)
- 2025至2031年中國(guó)臺(tái)式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報(bào)告
- 原發(fā)性腎病綜合征護(hù)理
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級(jí)上冊(cè)
- 2025年中國(guó)電科集團(tuán)春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場(chǎng)安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 2024年考研英語一閱讀理解80篇解析
- 樣板間合作協(xié)議
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語文試題(解析版)
評(píng)論
0/150
提交評(píng)論