IPC訊息佇列使用詳細分析

2021-05-09 15:15:28 字數 1337 閱讀 5550

雖然說是程序間通訊中有關訊息佇列的乙個比較詳細的分析

同樣的,共享記憶體,訊號量和訊息佇列的公共部分知識也都同理

首先:使用xsi ipc需要首先了解識別符號和鍵的概念

識別符號是標識ipc物件的乙個量,通常由乙個int型變數表示,不過識別符號只是ipc物件的內部名,如果要使的多個程序能夠使用同乙個ipc,需要得到乙個外部名,這個外部名就是鍵--key,每個ipc物件都與乙個鍵相關聯

對於訊息佇列:可以通過函式magget通過乙個鍵獲得他的識別符號,即通過外部標識得到內部標識的乙個方法

例如:我們知道乙個訊息佇列的鍵是msg_key;

那麼:可以通過下列**段

int msg_id;

nsg_id=msgget(msg_key,0666|ipc_creat|ipc_excl);

獲取訊息佇列的id。

得到了訊息佇列的id後,我們就可以開始作很多行為了

如果你想要改變訊息佇列的一些屬性,可以使用函式msgctl

如果想從訊息佇列中傳送訊息或獲取訊息,可以使用這兩個函式

msgsnd,msgrcv

下面詳細講解一下msgsnd

這個函式的原型是:

int msgsnd(int msgid,const void *ptr,size_t nbytes,int flags);

第乙個引數是訊息佇列的id

第二個引數是要傳送給訊息佇列的正長整形型別字段    稍後解釋這個引數

第三個引數是要傳送的實際資料位元組(對應於長度)

第四個引數是設定符

如果我們想傳送一段資料,我們可以這樣做:

首先,建立乙個這樣的結構體

struct mymsg

long mtype;                      //這就是第二個引數所說的正長整形型別字段,表示傳送資訊的型別

char mtext[size];             //size 可以自定,跟第三個引數有關

下面是向訊息佇列傳送一段資料的**段

struct mymsg

msg;

msg.type=1;

strcpy(msg.mtext,"hello");

if(msgsnd(msg_id,&msg,10,ipc_nowait)==-1)

fatal("msgsnd");

printf("send sucess!/n");

exit(0);

值得注意的是,第三個引數是結構體中第二個成員的大小,而不是整個結構體的大小 

下面是《unix環境高階程式設計》中第15章中習題5.12   剛寫的  發出來吧,希望對大家能夠有所幫助,如果

有朋友也在看這本書的話,很希望多多交流~~

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...