16 消息队列1

本文详细介绍了消息队列的概念、创建及使用方法。包括消息队列与管道、队列的区别,创建函数msgget,发送函数msgsnd,接收函数msgrcv,控制函数msgctl等关键API的使用,并附带了一个简单的C语言示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 管道、队列 与IPC的消息队列有什么区别呢?

消息队列是链式的,消息的类型可以不一致。


消息队列中维护队列的结构体msqid_ds,其中的第一个消息指针msg_first,最后一个指针msg_last..

每个消息中包含数据data,数据的长度length,数据的类型type。


2. 消息队列创建函数msgget

创建了消息队列后可以通过system("ipcs -q");查看队列信息

头文件: #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

函数原型: int msgget(key_t key, int flag);

参数: key,和消息队列关联的key值

flag,消息队列的访问权限

返回: 成功,消息队列ID

出错:-1

3. 发送消息队列msgsnd

函数原型: int msgsnd(int msqid, const void *msgp, size_t size, int flag)

参数: msqid,消息队列ID

msgp,指向消息的指针

常用消息结构msgbuf如下:

struct msgbuf{

long mtype; //消息类型

car mtext[N]; //消息正文

}

size,发送的消息正文字节数

flag,IPC_NOWAIT,消息没有发送完函数也会立即返回

0,直到发送完函数才返回

返回:

成功0

出错-1

4. 接收消息函数msgrcv

函数原型: int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)

参数: msgid,消息队列号

msgp,接收消息的缓冲区

size,要接收的消息字节数

msgtype,0:接收消息队列中第一个消息

>0,接收消息队列中第一个类型为msgtype的消息

<0,接收消息队列中类型值不大于msgtype的绝对值切类型值又最小的消息

flag,0:若无消息函数一直阻塞

IPC_NOWAIT,若没消息,进程立即返回ENOMSG

返回: 成功,接收到的消息长度

出错-1

5. 消息队列控制函数msgctl

原型: int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)

参数: msgid,消息队列ID

cmd,IPC_STAT,读取消息队列的属性,并将其保存在buf指向的缓冲区

IPC_SET,设置消息队列属性,这个值取自buf参数

IPC_RMID,从系统中删除消息队列

buf,消息队列缓冲区

返回: 成功0,,出错-1

6. 实例

#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
  int msgid;
  msgid=msgget(IPC_PRIVATE,0777);
  if(msgid <0)
  {
	printf("creat message queue failure\n");
	return -1;
  }
  printf("creat message queue  sucess msgid=%d\n",msgid);
  system("ipcs -q");

  //delete message queue
  msgctl(msgid,IPC_RMID,NULL);
  system("ipcs -q");
  return 0;
}
执行结果:

alex@alex-virtual-machine:/extra/process/sixteen$ ./a.out
creat message queue  sucess msgid=0

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x00000000 0          alex       777        0            0


------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

alex@alex-virtual-machine:/extra/process/sixteen$


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值