linux下程序間通訊(2)

2021-08-11 13:58:05 字數 2777 閱讀 8765

1.訊息佇列

訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

2.訊息佇列結構定義

struct msqid_ds *msgque[msgmni]向量:
msgque[msgmni]是乙個msqid_ds結構的指標陣列,每個msqid_ds結構指標代表乙個系統訊息佇列,msgque[msgmni]的大小為msgmni=128,也就是說系統最多有msgmni=128個訊息佇列。

3.建立乙個訊息佇列?

int

msgget(key_t, key, int msg***);

msg***是乙個許可權標誌,表示訊息佇列的訪問許可權,它與檔案的訪問許可權一樣。msg***可以與ipc_creat做或操作,表示當key所命名的訊息佇列不存在時建立乙個訊息佇列,如果key所命名的訊息佇列存在時,ipc_creat標誌會被忽略,而只返回乙個識別符號。

4.將訊息新增到訊息佇列

int msgsend(int msgid, const

void *msg_ptr, size_t msg_sz, int msg***);

msgid是由msgget函式返回的訊息佇列識別符號。

msg_ptr是乙個指向準備傳送訊息的指標,但是訊息的資料結構卻有一定的要求,指標msg_ptr所指向的訊息結構一定要是以乙個長整型成員變數開始的結構體,接收函式將用這個成員來確定訊息的型別。所以訊息結構要定義成這樣:

struct my_message;
msg_sz是msg_ptr指向的訊息的長度,注意是訊息的長度,而不是整個結構體的長度,也就是說msg_sz是不包括長整型訊息型別成員變數的長度。

msg***用於控制當前訊息佇列滿或佇列訊息到達系統範圍的限制時將要發生的事情。

如果呼叫成功,訊息資料的一分副本將被放到訊息佇列中,並返回0,失敗時返回-1.

5.如何從乙個訊息佇列中獲取訊息?

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long

int msgtype, int msg***);

msgid, msg_ptr, msg_st的作用也函式msgsnd函式的一樣。

msgtype可以實現一種簡單的接收優先順序。如果msgtype為0,就獲取佇列中的第乙個訊息。如果它的值大於零,將獲取具有相同訊息型別的第乙個資訊。如果它小於零,就獲取型別等於或小於msgtype的絕對值的第乙個訊息。

msg***用於控制當佇列中沒有相應型別的訊息可以接收時將發生的事情。

呼叫成功時,該函式返回放到接收快取區中的位元組數,訊息被複製到由msg_ptr指向的使用者分配的快取區中,然後刪除訊息佇列中的對應訊息。失敗時返回-1.

6.共享記憶體

共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。得到共享記憶體有兩種方式:對映/dev/mem裝置和記憶體映像檔案。前一種方式不給系統帶來額外的開銷,但在現實中並不常用,因為它控制訪問的將是實際的物理記憶體,在linux系統下,這只有通過限制linux系統訪問的記憶體才可以做到,這當然不太實際。常用的方式是通過shm***函式族來實現利 用共享記憶體進行儲存的。

7.函式是shmget有什麼作用

int shmget(key_t key, int

size, int flag);

這個函式有點類似大家熟悉的malloc函式,系統按照請求分配size大小的記憶體用作共享記憶體。linux系統核心中每個ipc結構都有的乙個非負整數 的識別符號,這樣對乙個訊息佇列傳送訊息時只要引用識別符號就可以了。這個識別符號是核心由ipc結構的關鍵字得到的,這個關鍵字,就是上面第乙個函式的key。資料型別key_t是在標頭檔案sys/types.h中定義的,它是乙個長整形的資料。在我們後面的章節中,還會碰到這個關鍵字。所以,函式shmget,它的作用是可以獲得乙個共享儲存識別符號。

8.當共享記憶體建立後,其餘程序該如何將共享儲存識別符號接到自身的位址空間中?

當共享記憶體建立後,其餘程序可以呼叫shmat()將其連線到自身的位址空間中。

void *shmat(int shmid, void *addr, int flag);
shmid為shmget函式返回的共享儲存識別符號,addr和flag引數決定了以什麼方式來確定連線的位址,函式的返回值即是該程序資料段所連線的實際位址,程序可以對此程序進行讀寫操作。

使用共享儲存來實現程序間通訊的注意點是對資料訪問的同步,必須確保當乙個程序去讀取資料時,它所想要的資料已經寫好了。通常,訊號量被要來實現對共享儲存資料訪問的同步,另外,可以通過使用shmctl函式設定共享儲存記憶體的某些標誌位如shm_lock、shm_unlock等來實現。

9.何為訊號量?

訊號量又稱為訊號燈,它是用來協調不同程序間的資料物件的,而最主要的應用是前一節的共享記憶體方式的程序間通訊。本質上,訊號量是乙個計數器,它用來記錄對某個資源(如共享記憶體)的訪問狀況。

10.一般說來,為了獲得共享資源,程序可以進行那些操作?

(1) 測試控制該資源的訊號量。

(2) 若此訊號量的值為正,則允許進行使用該資源。程序將訊號量減1。

(3) 若此訊號量為0,則該資源目前不可用,程序進入睡眠狀態,直至訊號量值大於0,程序被喚醒,轉入步驟(1)。

(4) 當程序不再使用乙個訊號量控制的資源時,訊號量值加1。如果此時有程序正在睡眠等待此訊號量,則喚醒此程序。

linux下程序間通訊

linux下程序間通訊的幾種主要手段簡介 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊 訊號 signal 訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發...

Linux下程序間通訊

linux下的程序通訊基本上是從unix平台上的程序通訊繼承來的。而對unix發展做出最大貢獻的倆大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序的通訊方面的側重點有所不同。前者是對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v ipc...

Linux 程序間通訊2

一 共享記憶體 1 共享記憶體是被多個程序共享的一部分物理記憶體.共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以 立刻 看到其中的內容 2.共享記憶體實現分為兩個步驟 一 建立共享記憶體,使用shmget函式 二 對映共享記憶體,將...