Linux消息隊列實踐(1)
來源:程序員人生 發(fā)布時間:2014-12-08 08:22:08 閱讀次數(shù):2658次
消息隊列基本概念
消息隊列提供了1個從1個進程向另外1個進程發(fā)送1塊數(shù)據(jù)的方法(僅局限與本機)
每一個數(shù)據(jù)塊都被認為是有1個類型,接收者進程接收的數(shù)據(jù)塊可以有不同的類型值
消息隊列也有管道1樣的不足,就是每一個消息的最大長度是有上限的(MSGMAX),每一個消息隊列的總的字節(jié)數(shù)是有上限的(MSGMNB),系統(tǒng)上消息隊列的總數(shù)也有1個上限(MSGMNI)
管道 vs. 消息隊列:
管道: 流管道 消息: 有邊界
先進先出 可以落后入、先出來
消息隊列大小3大限制
cat /proc/sys/kernel/msgmax #最大消息長度限制
cat /proc/sys/kernel/msgmnb #消息隊列總的字節(jié)數(shù)
cat /proc/sys/kernel/msgmni #消息條目數(shù)

IPC對象數(shù)據(jù)結構
內(nèi)核為每一個IPC對象保護1個數(shù)據(jù)結構
- 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;
- };
消息隊列在內(nèi)核中的表示

消息隊列函數(shù)示例
msgget函數(shù)
功能:用來創(chuàng)建和訪問1個消息隊列
原型:
- int msgget(key_t key, int msgflg);
參數(shù):
key: 某個消息隊列的名字
msgflg:由9個權限標志構成,如0644,它們的用法和創(chuàng)建文件時使用的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函數(shù)參數(shù)關系圖

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈