Linux 訊息佇列程式設計

2021-07-10 10:17:45 字數 2088 閱讀 8599

訊息佇列、訊號量以及共享記憶體被稱作 xsi ipc,它們均來自system v的ipc功能,因此具有許多共性。

鍵和識別符號:

核心中的每一種ipc結構(比如訊號量、訊息佇列、共享記憶體)都用乙個非負整數的識別符號加以標示(如共享記憶體的shmid、訊號量的semid、以及訊息佇列的msgid)。不同於檔案描述符,ipc識別符號不是乙個小的非負整數,它是乙個int型的整數,當乙個識別符號被建立,以後又被刪除時,這個整數持續加1,達到整型的最大值後,重新回到0。

但是每乙個ipc物件在核心中的識別符號只能在內部被識別,為了讓不同的程序能夠在同乙個ipc物件上匯合,還需要乙個外部的標識來表示乙個ipc 物件,這就是key 鍵值。或者可以這樣理解:識別符號是乙個開啟了的ipc物件的描述符,而鍵值則讓程序獲得這個識別符號。

當我們通過乙個鍵值建立了乙個ipc物件以後,就可以用這個ipc物件的識別符號操作這個ipc物件。例如當程序用指定的鍵值獲得乙個共享記憶體的識別符號shmid以後,就可以通過這個識別符號將共享記憶體對映到自身的位址空間上,當然後續對共享記憶體的操作也是基於這個識別符號。

訊息佇列程式設計:

訊息佇列作為xsi ipc的一種,許多實現和操作和前面描述的訊號量和共享記憶體有很多相似的地方。先簡述一下訊息佇列的原理:訊息佇列的本質就是乙個訊息的鍊錶,而每個訊息的結構如下:

struct msgbuf ;

mtype:訊息的型別        mtext: 訊息中的資料

也就是說訊息佇列就是乙個資料域是以上結構體的鍊錶。既然了解了乙個訊息佇列的本質就是乙個鍊錶,可以想象,如果程序間要通過訊息佇列通訊,那麼傳送訊息的程序的主要工作就是要構建乙個資料域,然後交給核心來插入到鍊錶中,而接收訊息的程序就是通過核心函式來將資料從訊息佇列中取出來。訊息佇列還有如下特點:

*訊息佇列的訊息型別可以不同,程序取出訊息時可以指定訊息型別取出需要的訊息

*當程序取出一條訊息後,該訊息會立即被移出訊息佇列

利用訊息佇列通訊主要由以下操作完成:

*建立/開啟訊息佇列   :int msgget(key_t key, int msg***);

*傳送訊息                 :int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***)

*接收訊息                 :ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msg***)

*刪除訊息佇列           :int msgctl(int msqid, int cmd, struct msqid_ds *buf)

這些函式都可以通過man命令查到具體的用法,這裡就不在詳細解釋,下面是乙個測試的範例:

send 程式:

#include #include #include #include #define text_sz 2048

struct msgt

;int main()

}//刪除訊息佇列

msgctl(msgid, ipc_rmid, 0);

return 0;

}

receive 程式:

#include #include #include #include #include #define text_sz 2048

struct msgt

;int msgid;

void childprocess()

}}int main()

else if(pid==0)

}return 0;

}

當兩個程式執行起來以後可以發現通過send成序傳送的資料在receive 中可以接收到,說明這些函式的呼叫很成功,同時也證明了訊息佇列的通訊是成功的。

訊息佇列程式設計

訊息佇列 就是乙個訊息的鍊錶。而一條訊息則可看作乙個記錄,具有特定的格式。程序可以向中按照一定的規則新增新訊息 另一些程序則可以從訊息佇列中讀走訊息 傳送訊息佇列 include include include include struct msgt int msg type char str 25...

Linux訊息佇列程式設計(簡單應用)

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...

訊息佇列程式設計收發資料

1.server.c include include include include include 用於建立乙個唯一的key 訊息結構 struct msg form int main 列印key值 printf message queue server key is d.n key 建立訊息佇列...