目錄
1.消息隊(duì)列的原理:
2.消息隊(duì)列的接口:
? ? ? ? (1)創(chuàng)建消息隊(duì)列
? ? ? ? (2)向消息隊(duì)列發(fā)送消息
? ? ? ? (3)接收消息
? ? ? ? ?(4)操作消息隊(duì)列的接口
1.消息隊(duì)列的原理:
消息隊(duì)列(messagequeue)以鏈表作為基礎(chǔ),實(shí)現(xiàn)消息隊(duì)列,由操作系統(tǒng)維護(hù)該鏈表
操作系統(tǒng)中,使用消息隊(duì)列描述符(qid)來區(qū)分每個(gè)消息隊(duì)列(qid是唯一的)
進(jìn)程在消息隊(duì)列的末尾增加消息,需要信息的進(jìn)程按照所需的類型在隊(duì)列中取消息
2.消息隊(duì)列的接口:
(1)創(chuàng)建消息隊(duì)列
? ? ? ? int megget(key_t,int msgflg)
參數(shù):?
key:消息隊(duì)列的標(biāo)識(shí)符
megflg:創(chuàng)建的標(biāo)志,如IPC_CREAT
IPC_CREAT :如果不存在就創(chuàng)建,按位或上一個(gè)權(quán)限
返回值:
成功:返回隊(duì)列ID
失敗:返回-1,并設(shè)置erron?
2)向消息隊(duì)列發(fā)送消息? ? ??
?
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
參數(shù):
msqid:消息隊(duì)列的ID
msgp:指向msgbuf的指針,用來發(fā)送指定的消息,在寫msgsnd、msgrev函數(shù)時(shí),要提前定義該結(jié)構(gòu)體,主要是指定mtext大小。
? ? ? msgp指向的msgbuf為發(fā)送的結(jié)構(gòu)體,操作系統(tǒng)指定了函數(shù)發(fā)送消息的格式,只定義了一部分,mtext可以由程序員自己改變。
?msgsz:要發(fā)送的消息的長(zhǎng)度,該參數(shù)的值不是表示msgp指向的msgbuf結(jié)構(gòu)體的大小,而是該結(jié)構(gòu)體中mtext的大小。
msgflg:創(chuàng)建標(biāo)記,如果指定了IPC_NOWAIT,失敗會(huì)立即返回。? ? ? ?
? ? ? ? ?0:阻塞發(fā)送
? ? ? ? ?IPC_NOWAIT:非阻塞發(fā)送
返回值:
? ? ? ? 0:成功
? ? ? ? -1:失敗,并設(shè)置errno
(3)接收消息
ssize_t msgrcv(int msqid , void *msgp,size_t msgsz,long msgtyp,int msgflg)
參數(shù):
msgid:消息隊(duì)列的ID
msgp:指向msgbuf的指針,用來接收消息
**struct? msgbuf{……}為輸出型參數(shù)
msgsz:需要接受的消息的長(zhǎng)度,注意msgsz是由msgp所指向的結(jié)構(gòu)體的成員 mtext的最大大小決定的(byte)
msgtyp有三種形式:
? ? ? ? 1.msgtyp=0:讀取隊(duì)列的第一個(gè)消息
? ? ? ? 2.msgtyp>0:讀取隊(duì)列類型為msgtyp的第一條消息,除非在msgflg中指定了 MSG_EXCEPT,否則將讀取類型不等于 megtyp的隊(duì)列中的第一條消息,
? ? ? ? 3.msgtyp<0:讀取隊(duì)列中最小類型小于或等于msgtyp絕對(duì)值的第一條消息
msgflg:創(chuàng)建標(biāo)記,若指定了IPC_NOWAIT,獲取失敗后就直接返回?
?? ? (4)操作消息隊(duì)列的接口
int msgctl(int msqid , int cmd, struct msqid_ds *buf)
參數(shù):
? ? ? ? msqid:消息隊(duì)列的ID
? ? ? ? cmd:控制命令:
? ? ? ? ? ? ? ? IPC_RMID,刪除命令
? ? ? ? ? ? ? ? IPC_STAT,獲取命令
? ? ? ? buf:存儲(chǔ)隊(duì)列的相關(guān)信息的buf
返回值:
? ? ? ? 成功:根據(jù)不同的cmd有不同的返回值
? ? ? ? 失敗: 返回-1,并設(shè)置errno
5.代碼實(shí)現(xiàn):
寫端發(fā)送消息,讀端從隊(duì)列讀取
mesgrcv:
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/ipc.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
int main()
{
int msg_id=msgget(0x06060606,IPC_CREAT|0664);
if(msg_id<0 )
{
perror("msgget \n" );
return 0;
}
printf("msggqueued id is %d\n",msg_id );
struct msgbuf mq;
msgrcv(msg_id,&mq,sizeof(mq.mtext),1,0);
printf("接受的消息:%s \n",mq.mtext);
return 0;
}
msgsnd:
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
struct msgbuf
{
long mtype; //message type
char mtext[512]; //message data
};
int main()
{
int msg_qid=msgget(0x06060606,IPC_CREAT|0664);
if(msg_qid<0 )
{
perror("msgget\n");
return 0;
}
struct msgbuf mq;
int i;
for(i=0;i<10;i++)
{
mq.mtype=i+1;
sprintf(mq.mtext,"%s,%d ","xxxxxxxxxx ",i+1);
msgsnd(msg_qid,&mq,sizeof(mq.mtext),0);
}
return 0;
}
查看系統(tǒng)中的message queue:
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-455352.html
當(dāng)多次讀出時(shí),由于消息已經(jīng)出了隊(duì)列,所以不能再讀出。文章來源地址http://www.zghlxwxcb.cn/news/detail-455352.html
到了這里,關(guān)于Linux進(jìn)程通信之消息隊(duì)列的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!