消息队列
消息队列
消息队列全称Message Queue。
每一个消息队列都有自己的键值。
无论是消息队列、信号量组还是内存共享,都是使用ipcs命令可以查看这些文件的信息。

- 创建消息队列
使用shell命令ipcmk可以创建一个消息队列

int msgget(key_t key, int msgflg);
//这个函数创建一个消息队列
//第一个参数是消息队列的键值
//第二个参数是创建消息队列的权限(644)以及方式(O_CREAT)
//返回值是消息队列的id
在消息队列中,键值是32位的,他的组成是由规律的:proj_id的低8位+ 设备编号的低8位+ inode编号的低16位。
在上述的信息中,设备编号低8位和索引编号的低16位在下面的函数可以查看到
int stat(const char *pathname, struct stat *statbuf);
//上面类型的结构体部分
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
可以在上面看到第一个成员和第二个成员就是设备编号和索引编号。
还有最后一个信息,proj_id的低8位,可以在下面的函数自定义,不可以是0,1-255,的范围
key_t ftok(const char *pathname, int proj_id);
//如果两次打开填写的参数相同那么,获取的键值也是相同的
//key_y这个类型是int
//返回值,返回-1出错,返回其他是消息队列的键值
可以看到最上面的函数msgget()函数需要ftok()函数去获取key_t这个值作为参数。
- 访问消息队列
创建完消息队列之后需要可以访问消息队列
linux系统提供了msgrcv()和msgsnd()两个收发函数
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//第一个参数his消息队列的id
//第二个参数是一个结构体,如下建议格式类型
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
//第三个参数是发送数据的字节大小,注意不是结构体的大小,是mtext的大小
//第四个参数可以指定发送的时候是否是阻塞之类的,如IPC_NOWAIT这个选项就可以防止阻塞
//返回值成功返回0,失败返回-1
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//第一个参数是消息队列的id
//第二个参数是结构体,用来读取信息用的
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
//第三个参数是一次性读取多少个字节
//第四个参数是指定类型,如果发送信息的时候mtype填了8,那么读取的时候也填了8,那么无论消息队列前面有多少数据,都是优先读取,第一个mtype为8的数据。如果填0那么就是读取消息队列的第一个。
//第五个参数也是读取的是否为阻塞之类的
//返回值真实读取的字节


浙公网安备 33010602011771号