消息队列基本概念
消息队列提供了1个从1个进程向另外1个进程发送1块数据的方法(仅局限与本机)
每一个数据块都被认为是有1个类型,接收者进程接收的数据块可以有不同的类型值
消息队列也有管道1样的不足,就是每一个消息的最大长度是有上限的(MSGMAX),每一个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有1个上限(MSGMNI)
管道 vs. 消息队列:
管道: 流管道 消息: 有边界
先进先出 可以落后入、先出来
消息队列大小3大限制
cat /proc/sys/kernel/msgmax #最大消息长度限制
cat /proc/sys/kernel/msgmnb #消息队列总的字节数
cat /proc/sys/kernel/msgmni #消息条目数
IPC对象数据结构
内核为每一个IPC对象保护1个数据结构
- struct ipc_perm
- {
- key_t __key;
- uid_t uid;
- gid_t gid;
- uid_t cuid;
- gid_t cgid;
- unsigned short mode;
- unsigned short __seq;
- };
消息队列独有的结构
- struct msqid_ds
- {
- struct ipc_perm msg_perm;
- time_t msg_stime;
- time_t msg_rtime;
- time_t msg_ctime;
- unsigned long __msg_cbytes;
-
- msgqnum_t msg_qnum;
-
- msglen_t msg_qbytes;
-
- pid_t msg_lspid;
- pid_t msg_lrpid;
- };
消息队列在内核中的表示
消息队列函数示例
msgget函数
功能:用来创建和访问1个消息队列
原型:
- int msgget(key_t key, int msgflg);
参数:
key: 某个消息队列的名字
msgflg:由9个权限标志构成,如0644,它们的用法和创建文件时使用的mode模式标志是1样的(但是消息队列没有x(履行)权限)
返回值:
成功返回消息队列编号,即该消息队列的标识码;失败返回⑴
编程实践
-
- int main()
- {
-
-
-
- int msgid = msgget(IPC_PRIVATE,0666);
- if (msgid < 0)
- {
-
- if (errno == ENOENT)
- {
- cout << "ENOENT" << endl;
- }
- err_exit("mesget error");
- }
- else
- {
- cout << "msgid = " << msgid << endl;
- }
-
- return 0;
- }
-
-
-
-
- int main()
- {
-
- int msgid = msgget(0x1235,0666|IPC_CREAT);
- if (msgid < 0)
- {
-
- if (errno == ENOENT)
- {
- cout << "ENOENT" << endl;
- }
- err_exit("mesget error");
- }
- else
- {
- cout << "msgid = " << msgid << endl;
- }
-
- return 0;
- }
-
- int main()
- {
-
- int msgid = msgget(0x1235,0666|IPC_CREAT|IPC_EXCL);
- if (msgid < 0)
- {
- err_exit("mesget error");
- }
- else
- {
- cout << "msgid = " << msgid << endl;
- }
-
- return 0;
- }
-
- int main()
- {
-
- int msgid = msgget(0x255,0444 | IPC_CREAT);
- if (msgid < 0)
- {
- err_exit("mesget error");
- }
- else
- {
- cout << "Create Mes OK, msgid = " << msgid << endl;
- }
-
-
- msgid = msgget(0x255,0644 | IPC_CREAT);
- if (msgid < 0)
- {
- err_exit("mesget error");
- }
- else
- {
- cout << "Create Mes OK, msgid = " << msgid << endl;
- }
-
- return 0;
- }
msgget函数参数关系图