Linux訊息佇列通訊及相關API演示

2021-10-08 20:27:22 字數 3167 閱讀 2193

訊息佇列存在於linux核心中,可以使資料雙向流動

資料在核心中,即使程序結束資料依然存在

訊息佇列實際上是訊息鍊錶,每個佇列都有自己的識別符號

msgget

建立乙個訊息佇列

1.原函式

#include #include #include int msgget(key_t key, int msg***);
2. 示例:

key_t key;

key =

ftok

("."

,'z');

int msgid =

msgget

(key,ipc_creat|

0777

);

msgsnd 和 msgrcv

傳送/接受資料到訊息佇列

1.原函式

#include #include #include 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***);

其中msgp預設結構體如下:

struct msgbuf ;
2.示例

struct msgbuf 

;struct msgbuf sendbuf =

;struct msgbuf readbuf;

msgrcv

(msgid,

&readbuf,

sizeof

(readbuf.mtext)

,888,0

);msgsnd

(msgid,

&sendbuf,

strlen

(sendbuf.mtext),0

);

msgctl

控制訊息佇列

1.原函式

#include #include #include int msgctl(int msqid, int cmd, struct msqid_ds *buf);
其中msqid_ds預設結構體如下:

struct msqid_ds ;
程式1:

#include

#include

#include

#include

#include

struct msgbuf

;int

main()

;struct msgbuf readbuf;

key_t key;

key =

ftok

("."

,'z');

//獲取key值

printf

("key=%x\n"

,key)

;int msgid =

msgget

(key,ipc_creat|

0777);

//建立訊息佇列

if(msgid ==-1

)msgsnd

(msgid,

&sendbuf,

strlen

(sendbuf.mtext),0

);//向訊息佇列888傳送資料

msgrcv

(msgid,

&readbuf,

sizeof

(readbuf.mtext)

,988,0

);//從訊息佇列988接受資料

printf

("return from get:%s\n"

,readbuf.mtext)

;msgctl

(msgid,ipc_rmid,

null);

//關閉訊息佇列

return0;

}

程式2:

#include

#include

#include

#include

#include

struct msgbuf

;int

main()

;struct msgbuf readbuf;

key_t key;

key =

ftok

("."

,'z');

//獲取key值

printf

("key=%x\n"

,key)

;int msgid =

msgget

(key,ipc_creat|

0777);

// 建立訊息佇列

if(msgid ==-1

)msgrcv

(msgid,

&readbuf,

sizeof

(readbuf.mtext)

,888,0

);//從訊息佇列888接受資料

printf

("read from que:%s\n"

,readbuf.mtext)

;msgsnd

(msgid,

&sendbuf,

strlen

(sendbuf.mtext),0

);//向訊息佇列988傳送資料

msgctl

(msgid,ipc_rmid,

null);

//關閉訊息佇列

return0;

}

執行效果:

開啟任意程式後訊息佇列阻塞,等待另外乙個程式將所需資料錄入,開啟另外一程式後兩程式達到訊息通訊的目的。

linux 訊息佇列相關

ipcs u ipcs l 原型 int msgget key t key,int msg 引數 key 可以認為是乙個埠號,也可以由函式ftok生成。msg ipc creat值,若沒有該佇列,則建立乙個並返回新識別符號 若已存在,則返回原識別符號。ipc excl值,若沒有該佇列,則返回 1 若...

Linux程序通訊 訊息佇列

1.訊息佇列 訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除 系統中記錄訊息佇列的資料結構struct ipc ids msg ids位於核心中,系統中所有訊息佇列都可以在結構msg ids中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...

linux訊息佇列程序通訊

訊息佇列 也叫做報文佇列 是unix系統v版本中3種程序間通訊機制之一。另外兩種是訊號燈和共享記憶體。這些ipc機制使用共同的授權方法。只有通過系統呼叫將標誌符傳遞給核心之後,程序才能訪問這些資源。這種系統ipc物件使用的控制方法和檔案系統非常類似。使用物件的引用標誌符作為資源表中的索引。訊息佇列就...