Linux进程通信:消息队列
目录
1.消息队列的原理:
消息队列(messagequeue)以链表作为基础,实现消息队列,由操作系统维护该链表
操作系统中,使用消息队列描述符(qid)来区分每个消息队列(qid是唯一的)
进程在消息队列的末尾增加消息,需要信息的进程按照所需的类型在队列中取消息
2.消息队列的接口:
(1)创建消息队列
int megget(key_t,int msgflg)
参数:
key:消息队列的标识符
megflg:创建的标志,如IPC_CREAT
IPC_CREAT :如果不存在就创建,按位或上一个权限
返回值:
成功:返回队列ID
失败:返回-1,并设置erron
2)向消息队列发送消息
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
参数:
msqid:消息队列的ID
msgp:指向msgbuf的指针,用来发送指定的消息,在写msgsnd、msgrev函数时,要提前定义该结构体,主要是指定mtext大小。
msgp指向的msgbuf为发送的结构体,操作系统指定了函数发送消息的格式,只定义了一部分,mtext可以由程序员自己改变。
msgsz:要发送的消息的长度,该参数的值不是表示msgp指向的msgbuf结构体的大小,而是该结构体中mtext的大小。
msgflg:创建标记,如果指定了IPC_NOWAIT,失败会立即返回。
0:阻塞发送
IPC_NOWAIT:非阻塞发送
返回值:
0:成功
-1:失败,并设置errno
(3)接收消息
ssize_t msgrcv(int msqid , void *msgp,size_t msgsz,long msgtyp,int msgflg)
参数:
msgid:消息队列的ID
msgp:指向msgbuf的指针,用来接收消息
**struct msgbuf{……}为输出型参数
msgsz:需要接受的消息的长度,注意msgsz是由msgp所指向的结构体的成员 mtext的最大大小决定的(byte)
msgtyp有三种形式:
1.msgtyp=0:读取队列的第一个消息
2.msgtyp>0:读取队列类型为msgtyp的第一条消息,除非在msgflg中指定了 MSG_EXCEPT,否则将读取类型不等于 megtyp的队列中的第一条消息,
3.msgtyp<0:读取队列中最小类型小于或等于msgtyp绝对值的第一条消息
msgflg:创建标记,若指定了IPC_NOWAIT,获取失败后就直接返回
(4)操作消息队列的接口
int msgctl(int msqid , int cmd, struct msqid_ds *buf)
参数:
msqid:消息队列的ID
cmd:控制命令:
IPC_RMID,删除命令
IPC_STAT,获取命令
buf:存储队列的相关信息的buf
返回值:
成功:根据不同的cmd有不同的返回值
失败: 返回-1,并设置errno
5.代码实现:
写端发送消息,读端从队列读取
mesgrcv:
-
-
-
-
-
-
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:
-
-
-
-
-
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;
-
}
-
查看系统中的message queue:
当多次读出时,由于消息已经出了队列,所以不能再读出。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfebejh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13