一、消息队列的特点
消息队列是另外一种Linux下进程间通信的方式,可以在相互独立的进程间进行通信。通过在内核维护一个消息队列链表来通信,允许在进程间以异步的方式进行数据交换。相比与之前提到的共享内存,消息队列能传输特定类型的消息,可以根据先进先出的方式获取消息体,也可以获取特定类型的消息体,使得通信更加的便捷。消息队列有以下几个特点:
- 异步通信: 进程间传输数据不需要同步,可以随时传输
- 消息类型: 发送和接收都可以指定消息类型
- 先进先出: 如果不指定消息类型,则是按先进先出的方式来获取消息体
二、常见的API分析
1,msgget函数,用于创建或者获取一个消息队列标识符ID, 定义如下:
int msgget(key_t key, int msgflg);
key:键值,通过ftok获取,或者直接指定,key值唯一确定消息队列标识符ID
msgflag:消息队列的创建标志,同时还可以指定访问权限
IPC_CREATE : 消息队列不存在则创建
IPC_EXCL: 如果和IPC_CREATE一起使用,如果存在则返回错误,并返回已存在的错误码EEXIST
使用示例如下:
msgId = msgget(key, IPC_CREAT|IPC_EXCL|0666);
if(msgId == -1){
if(errno == EEXIST) //已存在则去获取
{
msgId = msgget(key, 0666);
}
}
2. msgsnd函数:发送消息,成功返回0,失败则返回-1,定义如下:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:消息队列标识符
msqp:消息体地址,一般是一个以下的自定义结构体: