消息队列基本概念 消息队列提供了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函数参数关系图 
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|