linux c 程序通訊之訊息佇列

2021-06-22 19:54:34 字數 1763 閱讀 8512

訊息佇列是乙個存放在核心中的訊息鍊錶,每個訊息佇列由佇列識別符號標識,與管道不同的是訊息佇列是放在核心當中,只有在核心重啟,或者顯式的刪除乙個訊息佇列,該訊息佇列才會被真正的刪除,以下會有幾個操作,

1.建立訊息佇列

#include

#include

key_t ftok(const char* pathname,int proj_id);

根據傳入的引數的唯一性,建立乙個訊息佇列

int  msgget(key_t key,int msgflag);

該引數ley是即為ftok函式的返回值,mshflag是乙個標識引數

ipc_create:如果核心中不存在於key相等的訊息佇列,則新建乙個訊息佇列

ipc_excl和ipc_create一起使用,如果對應鍵值的訊息對流已經存在,則出錯,返回-1

2.寫訊息佇列

int msgsnd(int msgid,struct msgbuf* msgp,size_t msgz,int msgflag)

msgid是訊息佇列的標識

msgp是傳送的訊息

msgz要傳送的訊息的大小

msgflag操作標識,當他是0的時候,當訊息佇列已曼則,msgsnd則會阻塞,直到可以寫入,如果msgflag是

ipc_nowait的時候,如果訊息佇列已滿則,立即返回

3.讀訊息佇列

int msgrcv(int msgid,struct msgbuf* msgp,size_t msglen,long msgtyp,int msgflag);

現在源**如下

msg_server.c

/** main.cpp

* * created on: jul 18, 2014

* author: john

*/#include#include#include#include#include#include#include#include#include#include#include#define buf_size 256

#define proj_id 32

#define path_name "/tmp"

#define server_msg 1

#define client_msg 2

using namespace std;

int main()

msgbuf;

// var define

int qid;//訊息佇列標識

int msglen;//訊息長度

key_t msgkey;

//獲取鍵值

msgkey=ftok(path_name,proj_id);

if(msgkey==-1)

msgbuf.msgtype=server_msg;

if( msgsnd(qid,&msgbuf,strlen(msgbuf.content)+1,0)==-1)

msgbuf;

// var define

int qid;//訊息佇列標識

int msglen;//訊息長度

key_t msgkey;

//獲取鍵值

msgkey=ftok(path_name,proj_id);

if(msgkey==-1)

msgbuf.msgtype=client_msg;

if( msgsnd(qid,&msgbuf,strlen(msgbuf.content)+1,0)==-1)

{cout<<"msg send failed"<

linux C 程序間通訊 訊息佇列

linux 引入訊息佇列的原因是,實現對緊急事件的處理。可以為訊息設定優先順序 下面是乙個共享訊息佇列的例子,在linux2.6的核心中能夠執行,通過訊息佇列實現程序間的通訊,可以自己選擇優先順序,本列優先順序設定為子程序自己的pid.2.6中能夠執行,include include include...

程序通訊之訊息佇列

程序通訊之訊息佇列 一 前言 前面講過,程序間管道的通訊,訊號量控制的通訊,以及一開始的訊號,這些都是程序的通訊方式。訊號通過響應某些條件產生事件,使得另一程序 即接收訊號的程序 做出相應的反應。管道是通過一端寫,另一端讀的方式進行通訊,即所謂的點對點通訊。訊號量是控制程序間對臨界資源訪問的乙個計數...

程序通訊之訊息佇列

1.測試 include include include include include include include includevoid msg show int msg id,struct msqid ds msg info printf n show msg info printf th...