資源描述:
《《linux進程間通信(消息隊列、信號量、共享內(nèi)存等)》》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux進程間通信(下)LinuxIPCprogramme桂電嵌入式交流群:156619189課程目標(biāo)SystemVIPC接口簡介SystemV消息隊列SystemV信號量SystemV共享內(nèi)存POSIXIPC接口Posix消息隊列Posix信號量Posix共享內(nèi)存SystemVIPC接口桂電嵌入式交流群:156619189SystemVIPC接口由于歷史原因,linux下的進程通信手段基本上是從Unix平臺上的進程通信手段繼承而來的.Unix發(fā)展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(
2、加州大學(xué)伯克利分校的伯克利軟件發(fā)布中心)在進程間通信方面的側(cè)重點有所不同貝爾實驗室對Unix早期的進程間通信手段進行了系統(tǒng)的改進和擴充,形成了“systemVIPC”,通信進程局限在單個計算機內(nèi).BSD則形成了基于套接口(socket)的進程間通信機制,可以在跨機器進行通信.由于Unix版本的多樣性,電子電氣工程協(xié)會(IEEE)開發(fā)了一個獨立的Unix標(biāo)準(zhǔn),這個新的ANSIUnix標(biāo)準(zhǔn)被稱為計算機環(huán)境的可移植性操作系統(tǒng)界面(POSIX)。他也發(fā)展出一套新的IPC接口.Linux本身支持POSIX接口.
3、因此也支持POSIX的IPC接口最初UnixIPC包括:管道、FIFO、信號,SystemVIPC包括:SystemV消息隊列、SystemV信號燈、SystemV共享內(nèi)存區(qū),PosixIPC包括:Posix消息隊列、Posix信號燈、Posix共享內(nèi)存區(qū)。SystemVIPC通常在多個操作系統(tǒng)均實現(xiàn),包括一般的嵌入式Linux系統(tǒng),因此本課程主要介紹systemVIPCLinux的IPCSystemVIPC指以下三種類型的IPC:SystemV消息隊列sys/msg.hSystemV信號燈sys/s
4、em.hSystemV共享內(nèi)存區(qū)sys/shm.h創(chuàng)建或打開函數(shù)msgget,semget,shmget控制操作函數(shù)msgctl,semctl,shmctl操作函數(shù)msgsnd,msgrcv,semop,shmat,shmdtSystemV關(guān)鍵字每一個SystemV對象(消息隊列,共享內(nèi)存和信號量)創(chuàng)建時,需要的第一個參數(shù)是整數(shù)的Key值,頭文件把key_t定義為一個整數(shù)SystemV創(chuàng)建對象時假設(shè)進行IPC通訊雙方都取了相同的key值.這樣將雙方關(guān)聯(lián)起來生成key的方法有三
5、種雙方直接設(shè)置為一個相同的整數(shù)為key值用IPC_PRIVA讓系統(tǒng)自動產(chǎn)生一個key值,用ftok函數(shù)將一個路徑轉(zhuǎn)換為key值ftok函數(shù)ftok函數(shù)把一個已存在的路徑名和一個整數(shù)標(biāo)識符轉(zhuǎn)換成一個key_t值,稱為IPC鍵(IPCkey):#includekey_tftok(constchar*pahtname,intid);如果pathname不存在,或者對調(diào)用進程不可訪問,ftok返回-1不能保證兩個不同的路徑名與同一個id值的組合產(chǎn)生不同的鍵。用于產(chǎn)生鍵的pahtname不
6、能是服務(wù)器存活期間由它反復(fù)創(chuàng)建并刪除的文件,否則會導(dǎo)致ftok多次調(diào)用返回不同的值SystemVIPC的類型報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。有足夠權(quán)限的進程可以向隊列中添加消息,被賦予讀權(quán)限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。共享內(nèi)存:使得多個進程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機
7、制,如信號量結(jié)合使用,來達到進程間的同步及互斥。信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。SystemV消息隊列桂電嵌入式交流群:156619189消息隊列消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權(quán)限的進程可以向中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息。消息隊列能夠克服早期unix通信機制的一些缺點,如數(shù)據(jù)量小,沒有實時性消息隊列(2)消息隊列消息通常要以一個longm
8、type放在消息開始,mtype成員代表消息類型,從消息隊列中讀取消息的一個重要依據(jù)就是消息的類型structmsgbuf{longmtype;charmtext[1];};消息隊列與管道以及有名管道相比,具有更大的靈活性它提供有格式字節(jié)流,有利于減少開發(fā)人員的工作量消息具有類型,在實際應(yīng)用中,可作為優(yōu)先級使用。這兩點是管道以及有名管道所不能比的消息隊列可以在幾個進程間復(fù)用,而不管這幾個進程是否具有親緣關(guān)系,這一點與有名管道很相似;但消息隊列是隨內(nèi)核持續(xù)