文章摘要: 消息队列分为两种:System V消息队列和Posix消息队列。
操作系统: debian8
参考文档: 《UNIX网络编程卷2--进程间通信》


创建消息队列:

$ ipcmk -Q -p 644
Message queue id: 262145

查看消息队列:

$ ipcs -q
 
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x08ffd99f 262145     user       644        0            0

删除消息队列:

$ ipcrm -q 262145

System V消息队列:System V消息队列比较简单,一共就那么4个函数就搞掂,但其与操作系统相关,大部分操作系统都支持。

打开消息队列:

#define    MSG_W    0200
#define    MSG_R    0400

int msgget(key_t key, int oflag);

msgid = msgget(0x1234, IPC_CREAT | S_IRUSR | S_IWUSR);

注意事项:
1.如果创建时不指定权限,会造成读写失败;
2.MSG_W与MSG_R未找到定义的头文件,实际上与S_IRUSR/S_IWUSR等值,所以可能新版本改为统一权限表;
3.key可用ftok函数产生,也可以直接指定数值,或者用IPC_PRVATE;

发送消息:

ret = msgsnd(msgid, &buf, 6, 0);

注意事项:
1.推荐第1个字段(4字节)固定为消息ID,后面跟消息内容(非强制要求,做消息筛选用)。

接收消息:

/*
 * 参数说明: msgid   - 消息队列标识
 *           buf     - 接收缓冲区
 *           bufsize - 缓冲区长度
 *           id      - 消息ID, 0表示接收所有消息
 *           flag    -  IPC_NOWAIT表示非阻塞模式,不指定默认为阻塞模式
 * 返 回 值: 正值:返回读取到的字节数,负值:读取失败
 */
ret = msgrcv(msgid, &buf,sizeof(buf), 0, IPC_NOWAIT);
struct msqid_ds info;
msgctl(msgid, IPC_RMID, NULL);    // 清空所有消息
msgctl(msgid, IPC_STAT, &info);   // 获取消息队列状态
msgctl(msgid, IPC_SET,  &info);   // 设置消息队列参数

Posix消息队列: Posix消息队列与文件操作相同,非系统标准库,编译时需指定-lrt选项。