程序間通訊(訊息佇列)

2021-06-25 09:20:12 字數 1740 閱讀 5840

在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道(pipe)及有名管道(named pipe)、訊號(signal)、訊息佇列(msg)、共享記憶體(shm)、訊號量、和套接字(socket),在這我就簡單的描述一下程序通訊中的資訊佇列(msg):

首先,訊息佇列的實現有重要的幾步:

1、建立或開啟訊息佇列;

int msgget(key_t key,int flag)

——key :代表返回新的或已有佇列的佇列id,ipc_private,可通過ftok生成

——返回值(int flag):訊息佇列id(msqid)

2、新增資訊;

int msgsnd(int msgqid,const  void *prt,size_t  size,int flag)

——其中prt指的是指向訊息佇列結構的指標,訊息佇列結構體:

struct  msgbuf

long  mtype;

char   mtext[1];

3、讀取資訊;

int  msgrcv(int  msgqid,struct  msgbuf *msgp,int  size,long  msgtype,int  flag)

——其中msgtype等於零:接收訊息對列中的第乙個訊息

大於零:接收訊息佇列中第乙個型別為沒事幹type的訊息

小於零:接收訊息佇列中第乙個型別值不小於msgtype絕對值且型別值又最小的訊息 

——在flag:如果flag=msg_noerror,代表若返回的訊息比size位元組多,則訊息就會截短到size位元組,且不通知訊息傳送程序

如果flag=ipc_nowait,代表若訊息並沒有立即傳送而呼叫程序會立即返回

如果flag=0,代表msgsnd呼叫阻塞直到條件滿足為止

4、控制訊息佇列。

int msgctl(int msgqid,int  cmd,struct  msqid_ds *buf)

如果cmd=ipc_set:代表設定訊息佇列的資料結構msgqid_ds中的ipc_perm元素的值。這個值取自buf引數

如果ipc_rmid:從系統核心中移走訊息佇列

下面是乙個簡單的**:

#include

#include

#include

#include

#include

#include

#include

#define bufsz 512

struct message

; int main()

if((qid=msgget(key,ipc_creat|0666))==-1)

printf("opened queue %d\n",qid);

puts("please enter the message to queue:");

if((fgets((&msg)->msg_text,bufsz,stdin))==null)

msg.msg_type = getpid();

len = strlen(msg.msg_text);

if((msgsnd(qid,&msg,len,0))<0)

if(msgrcv(qid,&msg,bufsz,0,0)<0)

printf("message is:%s\n",(&msg)->msg_text);

if((msgctl(qid,ipc_rmid,null))<0)

exit(0);

}

程序間訊息佇列通訊

要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...

程序間通訊 訊息佇列

有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...

程序間通訊 訊息佇列

訊息佇列 訊息佇列提供了一種從乙個程序向另乙個程序傳送資料塊的方法。每個資料塊都被認為是有乙個型別,接收者程序接收的資料塊可以有不同的型別值。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊...