在嵌入式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 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...
程序間通訊 訊息佇列
訊息佇列 訊息佇列提供了一種從乙個程序向另乙個程序傳送資料塊的方法。每個資料塊都被認為是有乙個型別,接收者程序接收的資料塊可以有不同的型別值。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊...