




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
5.1Linux下進程間通信概述
Linux下的進程間通信方式主要有:(1)管道(pipe)管道分為無名管道和有名管道,無名管道只能用于具有親緣關系進程間的通信,允許一個進程和另一個與它有共同祖先的進程之間進行通信,而有名管道除具有無名管道具有的功能外,還能用于無親屬關系的進程間的通信。
(2)信號(signal)信號是比較復雜的通信方式,用于通知接受進程有某種事件發(fā)生,除了用于進程間通信外,進程還可以發(fā)送信號給進程本身。Linux除了支持Unix早期信號語義函數(shù)signal外,還支持語義符合Posix.1標準的信號函數(shù)sigaction。
(3)消息隊列消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。它克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點,使具有寫權限的進程可以向隊列中添加消息,具有讀權限的進程可以讀取隊列中的消息。
(4)共享內存共享內存是最有用的進程間通信方式,它使得多個進程可以訪問同一塊內存空間。它往往需要與其它通信機制結合,如與信號量結合使用可實現(xiàn)進程間的同步與互斥。
(5)內存映射(mappedmemory)內存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現(xiàn)它。
(6)信號量(semaphore)主要作為進程間以及同一進程不同線程之間的同步手段。
(7)套接字(socket)應用更為廣泛的進程間通信機制,可用于不同機器之間的進程間通信。所有提供了TCP/IP協(xié)議棧的操作系統(tǒng)幾乎都提供了套接字,而所有這樣操作系統(tǒng),對套接字的編程方法幾乎是完全一樣的。
5.2管道通信5.2.1管道概述管道是Linux支持的最初UnixIPC形式之一,具有以下特點:(1)管道是半雙工的通信模式,數(shù)據只能向一個方向流動。(2)只能用于具有親緣關系的進程間的通信,即父子進程或者兄弟進程之間。(3)管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是單獨構成一種文件系統(tǒng),并且只存在與內存中。
5.2.2管道創(chuàng)建與關閉創(chuàng)建管道可以通過調用pipe函數(shù)來實現(xiàn)。pipe函數(shù)的語法要點如下:頭文件:#include<unistd.h>函數(shù)原型:intpipe(intfd[2])
pipe函數(shù)通過傳入兩個文件描述符來創(chuàng)建管道,調用成功時返回0,否則返回-1。
5.2.3管道讀寫一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
5.2.4標準流管道系統(tǒng)提供了一個popen函數(shù)來完成標準流管道的一系列創(chuàng)建過程;
popen函數(shù)的使用可大大減少代碼的編寫量,但是創(chuàng)建管道時缺少靈活性,該函數(shù)只能支持標準的I/O函數(shù),不能使用read、write這類不帶緩沖的I/O函數(shù)。關閉標準流管道使用pclose函數(shù)來完成,該函數(shù)關閉標準I/O流,并等待命令執(zhí)行結束。
5.2.5FIFO命名管道(namedpipes),因為這種管道的操作方式基于“先進先出”原理,也稱為FIFO(FirstInFirstOut)在程序中調用mkfifo函數(shù)創(chuàng)建FIFO管道,mkfifo函數(shù)調用的原型為:
#include<sys/types.h>#include<sys/state.h>intmkfifo(constchar*filename,mode_tmode);
5.3信號機制5.3.1信號概述1.信號及信號來源信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的。信號事件的發(fā)生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發(fā)送信號的系統(tǒng)函數(shù)是kill、raise、alarm、setitimer和sigqueue函數(shù),軟件來源還包括一些非法運算等操作。
2.信號的種類可以從兩個不同的分類角度對信號進行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時間的關系上:實時信號與非實時信號。
3.進程對信號的響應進程對信號的響應有以下三種方式:(1)忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即SIGKILL和SIGSTOP。(2)捕捉信號,定義信號處理函數(shù),當信號發(fā)生時,執(zhí)行相應的處理函數(shù)。(3)執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認操作。
5.3.2信號的發(fā)送1.kill()和raise()kill函數(shù)和kill系統(tǒng)命令一樣,可以發(fā)送信號給進程或者進程組。它不僅可以終止進程,還可以向進程發(fā)送其他信號。與kill函數(shù)不同,raise函數(shù)允許向其自身發(fā)送信號。kill函數(shù)相關語法要點:頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intkill(pid_tpid,intsigno)
raise函數(shù)相關語法要點:頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intraise(intsigno)
2.alarm()和pause()alarm函數(shù)可以在進程中設置一個定時器,當定時器指定的時間到達時,它就向進程發(fā)送SIGALARM信號。一個進程只有一個鬧鐘時間,如果在調用alarm之前已經設置過鬧鐘時間,則新設置的鬧鐘時間會替代以前設置的鬧鐘時間。alarm函數(shù)相關語法要點:頭文件:#include<unistd.h>函數(shù)原型:unsignedintalarm(unsignedintseconds)
pause函數(shù)是用于將調用進程掛起直至捕捉到信號為止,通常可用于判斷信號是否已到。pause函數(shù)相關語法要點:頭文件:#include<unistd.h>函數(shù)原型:intpause(void)函數(shù)返回值:返回值為-1,并把error值設為EINTR。
3.sigqueue()sigqueue函數(shù)是比較新的發(fā)送信號系統(tǒng)調用,主要是針對實時信號提出的(當然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue函數(shù)相關語法要點:頭文件:#include<sys/types.h>和#include<signal.h>函數(shù)原型:intsigqueue(pid_tpid,intsigno,constunionsigvalval)
4.setitimer()sigqueue函數(shù)是比較新的發(fā)送信號系統(tǒng)調用,主要是針對實時信號提出的(當然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue函數(shù)相關語法要點:頭文件:#include<sys/time.h>函數(shù)原型:intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue))
5.3.3信號的處理Linux主要有兩個函數(shù)實現(xiàn)信號的處理:signal()、sigaction()。1.signal函數(shù)signal函數(shù)相關語法要點:頭文件:#include<signal.h>函數(shù)原型:void(*signal(intsignum,void(*handler)(int)))(int)
2.信號集函數(shù)組信號集被定義為一種數(shù)據類型:typedefstruct{unsignedlongsig[_NSIG_WORDS];
}sigset_t
信號集用來描述信號的集合,Linux所支持的所有信號可以全部或部分的出現(xiàn)在信號集中,主要與信號阻塞相關函數(shù)配合使用。
5.4共享內存5.4.1共享內存概述SystemV進程間通信(IPC)包括3種機制:消息隊列、信號量、共享內存。SystemV共享內存把共享數(shù)據放在共享內存區(qū)域,任何想要訪問該數(shù)據的進程通過共享該內存區(qū)域來獲得訪問權。SystemV共享內存通過shmget獲得或創(chuàng)建一個IPC共享內存區(qū)域,并返回相應的標識符。
5.4.2共享內存的實現(xiàn)1.接口函數(shù)
SystemV為共享內存主要定義了fork()、shmget()、shmat()、shmdt()和shmctl()幾個API接口函數(shù)fork函數(shù)用于生成一個鍵值:key_tkey;shmget函數(shù)用于創(chuàng)建(或者獲?。┮粋€由key鍵值指定的共享內存對象;
shmat函數(shù)用于建立調用進程與由標識符shmid指定的共享內存對象之間的連接,返回被映射的段地址;shmdt函數(shù)用于斷開調用進程與共享內存對象之間的連接;shmctl函數(shù)用于對已創(chuàng)建的共享內存對象進行查詢、設值、刪除等操作.2.實例
5.5消息隊列5.5.1消息隊列概述消息隊列就是一個消息的鏈表??梢园严⒖醋饕粋€記錄,具有特定的格式以及特定的優(yōu)先級。用戶可以從消息隊列中添加消息、讀取消息。
下圖說明了內核與消息隊列是怎樣建立起聯(lián)系的。其中:structipc_idsmsg_ids是內核中記錄消息隊列的全局數(shù)據結構;structmsg_queue是每個消息隊列的隊列頭。
5.5.2消息隊列的實現(xiàn)1.接口函數(shù)
SystemV為消息隊列的實現(xiàn)主要定義了msgget()、msgsnd()、msgrcv()和msgctl()幾個API接口函數(shù)msgget函數(shù)用于創(chuàng)建或打開消息隊列msgsnd函數(shù)用于發(fā)送消息msgrcv函數(shù)用于讀取消息msgctl函數(shù)用于對由msqid標識的消息隊列執(zhí)行cmd操作
2.實例實例首先使用msgget函數(shù)創(chuàng)建一個新的消息隊列,接著使用msgsnd函數(shù)添加一個消息到消息隊列,然后使用msgrcv函數(shù)從消息隊列中讀取消息,最后使用msgctl函數(shù)刪除該消息隊列。
5.6信號量信號量用于保護系統(tǒng)中關鍵的代碼或者數(shù)據結構。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 實驗室風險控制措施的制定與實施考核試卷
- 農產品加工企業(yè)質量管理體系持續(xù)改進計劃考核試卷
- 健身器材安全標準與噪音控制標準考核試卷
- 萬用表設計與生產考核試卷
- 數(shù)字化制鞋業(yè)中的市場趨勢分析與預測模型考核試卷
- 復雜介質的熒光光譜特性研究考核試卷
- 數(shù)字化印刷品設計中的跨領域知識整合研究考核試卷
- 化妝品市場細分趨勢考核試卷
- 化學纖維在體育器材改良中的應用考核試卷
- 2025年中國PPC堵帽數(shù)據監(jiān)測報告
- 勞動仲裁內部培訓
- 工廠注塑考試題及答案
- 2024年懷化麻陽苗族自治縣招聘事業(yè)單位工作人員筆試真題
- 湖南省長沙市望城區(qū)第二中學2024-2025學年高一下學期6月第三次月考政治試卷(含答案)
- 四川省甘孜州道孚一中學2025屆七下英語期末統(tǒng)考試題含答案
- 廣東省深圳市寶安區(qū)2023-2024學年四年級下學期數(shù)學期末試卷(含答案)
- 緬甸語教學與學習作業(yè)指導書
- 水表制造企業(yè)生產條件要求征求意見稿
- 機械原理課程設計-沖壓機構及送料機構設計說明書
- 人民網刪除稿件(帖文)申請登記表
- 服裝校服投標書模板(精編版)
評論
0/150
提交評論