Linux进程间通信--消息队列
文章摘要: 消息队列分为两种: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选项。