system V 程序間通訊 訊息佇列

2021-08-22 16:32:12 字數 2918 閱讀 2754

程序間通訊,顧名思義就是程序和程序通訊,也就是程序a和程序b可以訪問核心的同一塊空間乙個放資料,乙個取資料,那麼這兩個程序就完成通訊通訊了。

訊息佇列也有管道一樣的不足:1.每個訊息的最大長度是有上限的msgmax位元組,每個訊息佇列的總位元組數是有上限的msgmnb,系統中訊息佇列的總數是有上限的msgmni

如何檢視:

用來建立/開啟乙個訊息佇列

函式原型:

int msgget(key_t key,int msgflag)

引數:key 表示訊息佇列的名字,通過key值可以找到訊息佇列,相當於open開啟檔案時的檔案描述符

msgflag 1.如果是建立檔案ipc_creat|0644許可權 2.如果是開啟乙個訊息佇列填0

返回值:成功返回訊息佇列的id,失敗返回-1

key乙個ipc物件的唯一標識,可以通過ftok生成

往訊息佇列中新增乙個資料塊,也就是往訊息佇列中新增一條訊息

函式原型:

int msgsnd(int msgid,const void*msg,size_t msgsz,int msgflag)

引數:msgid是訊息佇列id,也就是msgget成功的返回值

msg要傳送的訊息在哪兒

msgsz要傳送訊息的位元組數

msgflag預設給為0(表示裝滿了,阻塞) , 也可以設定為裝滿了報錯退出,此處不關心

返回值:成功0 失敗-1

注意:

一   傳送的訊息結構在兩方面受到制約

1.必須小於系統規定的上限值

2.必須以乙個長整數開始,接受者函式將通過這個長整數確定訊息的型別

二  訊息結構參考形式如下

struct msgbuf

;

三 msgsnd的第三個引數長度不包括上面所說的型別長度

從乙個訊息佇列中接收資料

函式原型:

ssize_t msgrcv(int id,void* msgp,size_t msgsz,long msgtyp,int msg***)

引數: id :訊息佇列id

msgp:指向準備接受的訊息,也就是取出來的訊息放在哪

msgsz :msgp指向的訊息長度,這個長度也不包含訊息型別長度

msgtyp:表示取哪個型別的訊息 >0只讀取特定型別資料 =0按照先進先出的順序讀取 <0變成優先順序佇列 出滿足型別小於等於msgtyp的第一條訊息

msg***:1.設定為0 阻塞 2.也可以設定為非阻塞 有就取,沒有出錯返回

返回值:失敗返回-1,成功返回實際放到緩衝區裡面的字元個數

刪除訊息佇列

函式原型:

int msgctl(int msgid, int cmd,struct msgid_ds*buf)

引數:msgid:訊息佇列id

cmd:取值為ipc_rmid表示刪除訊息佇列

buf:不關心給0

返回值:成功返回0,失敗返回-1

除了用上面介面刪除乙個訊息佇列也可以用命令

ipcs------檢視所有ipc物件(訊息佇列  共享記憶體 訊號量)

ipcs -q   檢視訊息佇列

ipcrm -q key  刪除訊息佇列

ipcrm -q msgid

1.發有型別的資料,取有型別的資料

2.系統中能建立的訊息佇列有上限,每個訊息佇列能裝的內容有限

3.每一次訪問訊息佇列要呼叫作業系統提供的介面函式,從使用者切到核心,由核心切到使用者,開銷太大

1.能夠應用於任意程序之間

2.雙向通訊

3.面向資料塊

4.內建同步互斥機制,多個程序讀寫不會出錯

5.生命週期隨核心

底下附上簡單實現的**:

msgget.c

#include#include#include#includeint main()

printf("msgget is ok\n");

}

msgrcv.c

#include#include#include#include#includestruct msgbuf

;int main(int argc,char* argv)

int id=msgget(1234,0);

if(id==-1)

struct msgbuf mb;

if( msgrcv(id,&mb,100,argv[1],0)==-1 )

printf("%s\n",mb.mtext);

}

msgsnd.c

#include#includestruct msgbuf

;int main(int argc,char* argv)

int id=msgget(1234,0);

if(id==-1)

struct msgbuf mb;

mb.mtype=atoi(argv[1]);

printf("msg:");

fgets(mb.mtext,99,stdin);

int r=msgsnd(id,&mb,strlen(mb.mtext),0);

if(r==-1)

}

System V 程序間通訊之訊息佇列

訊息佇列的基本模型 訊息佇列中有兩個資料結構 60 define msg mem scale 32 6162 define msgmni 16 ipcmni max of msg queue identifiers 63 define msgmax 8192 int max max size of ...

System V程序間通訊 共享記憶體

一 共享記憶體ipc原理 共享記憶體程序間通訊機制主要用於實現程序間大量資料的傳輸,共享記憶體是在記憶體中單獨開闢的一段記憶體空間,這段記憶體空間有自己特有的資料結構,包括訪問許可權 大小和最近訪問時間。資料結構定義如下 struct shmid ds 兩個程序在使用此共享記憶體空間之前,需要在程序...

程序間通訊筆記(4) SystemV 訊息佇列

systemv 訊息佇列使用訊息佇列識別符號標識,這個標識好像鍊錶中的頭節點,包含了許多資訊,當然最主要的還是指向資料節點的兩個指標msg first和msg last,分別表示訊息佇列中的第乙個和最後乙個訊息節點。操作systemv訊息佇列的函式。include include include i...