Linux程序通訊(二)

2021-08-13 04:04:47 字數 3004 閱讀 6771

共享記憶體是被多個程序共享的一部分物理記憶體.共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。

共享記憶體實現分為兩個步驟:

一、建立共享記憶體,使用shmget函式。

二、對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去,使用shmat函式。

int shmget ( key_t key, int size, int shm*** )

key標識共享記憶體的鍵值: 0/ipc_private。 當key的取值為ipc_private,則函式shmget()將建立一塊新的共享記憶體;如果key的取值為0,而引數shm***中又設定ipc_private這個標誌,則同樣會建立一塊新的共享記憶體。

返回值:如果成功,返回共享記憶體識別符號;如果失敗,返回-1

對映:

char * shmat ( int shmid, char *shmaddr, int flag)

引數:shmid:shmget函式返回的共享儲存識別符號

返回值:

如果成功,則返回共享記憶體對映到程序中的位址;如果失敗,則返回- 1

當乙個程序不再需要共享記憶體時,需要把它從程序位址空間中脫離。

int shmdt ( char *shmaddr )
unix早期通訊機制之一的訊號能夠傳送的資訊量有限,管道則只能傳送無格式的位元組流,這無疑會給應用程式開發帶來不便。訊息佇列(也叫做報文佇列)則克服了這些缺點。

訊息佇列就是乙個訊息的鍊錶.可以把訊息看作乙個記錄,具有特定的格式.程序可以向中按照一定的規則新增新訊息;另一些程序則可以從訊息佇列中讀走訊息。

目前主要有兩種型別的訊息佇列:

posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用

系統v訊息佇列是隨核心持續的,只有在核心重起或者人工刪除時,該訊息佇列才會被刪除。

訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,必須提供該訊息佇列的鍵值。

#include #include key_t ftok (char*pathname, char proj)

功能: 返回檔名對應的鍵值。

pathname: 檔名

proj: 專案名(不為0即可)

#include #include #include int msgget(key_t key, int msg***)

key: 鍵值,由ftok獲得。

msg***:標誌位。

返回值: 與健值key相對應的訊息佇列描述字

ipc_creat

建立新的訊息佇列

ipc_excl

與ipc_creat一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤。

ipc_nowait

讀寫訊息佇列要求無法得到滿足時,不阻塞

在以下兩種情況下,將建立乙個新的訊息佇列:

1、如果沒有與健值key相對應的訊息佇列,並且 msg***中包含了ipc_creat標誌位。

2、key引數為ipc_private。

建立:

int open_queue(key_t keyval)

return (qid);

}

傳送訊息:

include #include #include int msgsnd(int msqid,struct

msgbuf*msgp,int msgsz,int msg***)

功能:向訊息佇列中傳送一條訊息

msqid: 已開啟的訊息佇列id

msgp: 存放訊息的結構

msgsz: 訊息資料長度

msg***: 傳送標誌,有意義的msg***標誌為ipc_nowait,指明在訊息佇列沒有足夠空間容納要傳送的訊息時,msgsnd是否等待

訊息格式:

struct msgbuf

接收訊息:

#include #include #include int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msg***)

功能:從msqid代表的訊息佇列中讀取乙個msgtyp型別的訊息,並把訊息儲存在msgp指向的msgbuf結構中。在成功地讀取了一條訊息以後,佇列中的這條訊息將被刪除

舉個例子:

int read_message(int qid,long type,struct mymsgbuf*qbuf)

訊號量(又名:訊號燈)與其他程序間通訊方式不大相同,主要用途是保護臨界資源.

程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程序同步

分類:二值訊號燈 :訊號燈的值只能取0或1,類似於互斥鎖。 但兩者有不同,訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。

計數訊號燈 :訊號燈的值可以取任意非負值

Linux程序間通訊(二)

一 概念 匿名管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因此,即使程序與建立fifo的程...

Linux 程序間通訊詳解二

訊息佇列 訊息佇列提供了本機上從乙個程序向另外乙個程序傳送一塊資料的方法 每個資料塊都被認為有乙個型別,接收者程序接收的資料塊可以有不同的型別值 訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是由上限的 msgmax 每個訊息佇列的總的位元組數是有上限的 msgmnb 系統上訊息佇列的總數也有乙...

Linux程序通訊

linux程序通訊 無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用l...