Linux进程间通讯——消息队列
一、什么是消息队列
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型地数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。
Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。
二、在Linux中使用消息队列
Linux提供了一系列消息队列的函数接口来方便我们实现进程间通讯。
————————————————————————————————
1、ftok(3)函数
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id)
功能:将pathname和proj_id转化为system v IPC键值
参数:
pathname:需要是存在的、有访问权限的文件路径
proj_id:非0的整数。但是系统使用的是这个整数的有效低8位
返回值:
成功——key值被返回
-1——失败,errno被设置
————————————————————————————————
2、msgget(2)函数
int msgget(key_t key, int msgflg);
功能:获取一个消息队列
参数:key:ftok(3)的返回值
msgflg:
IPC_CREAT——如果消息队列不存在,则创建消息队列。注意权限的问题。
0 ——只是获取消息队列
返回值:
-1——失败 errno被搁置
非负整数——消息队列的ID
————————————————————————————————
3、msgsnd(2)函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
功能:向消息队列里放消息
参数:
msqid——指定了要操作的消息队列。msgget(2)的返回值
msgp——struct msgbuf{
long mtype;/* 消息类型,必须>0*/
char mtext[1]; /* message data*/
};
msgsz——是struct msgbuf结构体成员mtext的长度。
msgflg——IPC_NOWAIT (在空间不足的情况下立即返回)
0(在空间不足的情况下,阻塞到空间充足)
返回值:
0——成功
-1——失败 errno被设置
—————————————————————————————————
4、msgrcv(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)