多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > Linux消息隊列實踐(1)

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ù)結構

[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. struct ipc_perm  
  2. {  
  3.     key_t          __key;       /* Key supplied to msgget(2) */  
  4.     uid_t          uid;         /* Effective UID of owner */  
  5.     gid_t          gid;         /* Effective GID of owner */  
  6.     uid_t          cuid;        /* Effective UID of creator */  
  7.     gid_t          cgid;        /* Effective GID of creator */  
  8.     unsigned short mode;        /* Permissions */  
  9.     unsigned short __seq;       /* Sequence number */  
  10. };  

 

消息隊列獨有的結構

[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. struct msqid_ds  
  2. {  
  3.     struct ipc_perm msg_perm;     /* Ownership and permissions */  
  4.     time_t          msg_stime;    /* Time of last msgsnd(2) */  
  5.     time_t          msg_rtime;    /* Time of last msgrcv(2) */  
  6.     time_t          msg_ctime;    /* Time of last change */  
  7.     unsigned long   __msg_cbytes; /* Current number of bytes in 
  8.                                                 queue (nonstandard) */  
  9.     msgqnum_t       msg_qnum;     /* Current number of messages 
  10.                                                 in queue */  
  11.     msglen_t        msg_qbytes;   /* Maximum number of bytes 
  12.                                                 allowed in queue */  
  13.     pid_t           msg_lspid;    /* PID of last msgsnd(2) */  
  14.     pid_t           msg_lrpid;    /* PID of last msgrcv(2) */  
  15. };  

 

消息隊列在內(nèi)核中的表示


消息隊列函數(shù)示例

msgget函數(shù) 

功能:用來創(chuàng)建訪問1個消息隊列

原型:

[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. int msgget(key_t key, int msgflg);  

參數(shù):

    key: 某個消息隊列的名字

    msgflg:由9個權限標志構成,如0644,它們的用法和創(chuàng)建文件時使用的mode模式標志是1樣的(但是消息隊列沒有x(履行)權限)

 

返回值:

   成功返回消息隊列編號,即該消息隊列的標識碼;失敗返回⑴

 

編程實踐

[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐1:  IPC_PRIVATE:宏,值為0  
  2. int main()  
  3. {  
  4.   //IPC_PRIVATE每次創(chuàng)建的消息隊列的描寫符都是不同的!  
  5.   //因此,計時MessageID(key)傳送給其他進程(除非有關聯(lián)的進程),  
  6.   //其他進程也沒法使用該消息隊列(血緣fork除外)  
  7.     int msgid = msgget(IPC_PRIVATE,0666);  
  8.     if (msgid < 0)  
  9.     {  
  10.         //如果消息隊列不存在,則打開毛病,errno=ENOENT  
  11.         if (errno == ENOENT)  
  12.         {  
  13.             cout << "ENOENT" << endl;  
  14.         }  
  15.         err_exit("mesget error");  
  16.     }  
  17.     else  
  18.     {  
  19.         cout << "msgid = " << msgid << endl;  
  20.     }  
  21.   
  22.     return 0;  
  23. }  
  24. /** 
  25.   IPC_PRIVATE創(chuàng)建的消息隊列,只能用在與當前進程有關系的進程中使用! 
  26. */  


[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐2:  IPC_CREAT  
  2. int main()  
  3. {  
  4.     //指定IPC_CREAT,則1定會創(chuàng)建消息隊列  
  5.     int msgid = msgget(0x1235,0666|IPC_CREAT);  
  6.     if (msgid < 0)  
  7.     {  
  8.         //如果消息隊列不存在,則打開毛病,errno=ENOENT  
  9.         if (errno == ENOENT)  
  10.         {  
  11.             cout << "ENOENT" << endl;  
  12.         }  
  13.         err_exit("mesget error");  
  14.     }  
  15.     else  
  16.     {  
  17.         cout << "msgid = " << msgid << endl;  
  18.     }  
  19.   
  20.     return 0;  
  21. }  


[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐3:  IPC_CREAT|IPC_EXCL  
  2. int main()  
  3. {  
  4.     //指定IPC_EXCL, 如果已存在,則報告文件已存在(毛病)  
  5.     int msgid = msgget(0x1235,0666|IPC_CREAT|IPC_EXCL);  
  6.     if (msgid < 0)  
  7.     {  
  8.         err_exit("mesget error");  
  9.     }  
  10.     else  
  11.     {  
  12.         cout << "msgid = " << msgid << endl;  
  13.     }  
  14.   
  15.     return 0;  
  16. }  




[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐4:低權限創(chuàng)建,高權限打開  
  2. int main()  
  3. {  
  4.     //低權限創(chuàng)建  
  5.     int msgid = msgget(0x255,0444 | IPC_CREAT);  
  6.     if (msgid < 0)  
  7.     {  
  8.         err_exit("mesget error");  
  9.     }  
  10.     else  
  11.     {  
  12.         cout << "Create Mes OK, msgid = " << msgid << endl;  
  13.     }  
  14.   
  15.     //高權限打開  
  16.     msgid = msgget(0x255,0644 | IPC_CREAT);  
  17.     if (msgid < 0)  
  18.     {  
  19.         err_exit("mesget error");  
  20.     }  
  21.     else  
  22.     {  
  23.         cout << "Create Mes OK, msgid = " << msgid << endl;  
  24.     }  
  25.   
  26.     return 0;  
  27. }  


msgget函數(shù)參數(shù)關系圖

 

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲天堂免费在线视频 | 国产福利一区二区在线观看 | 99热久久这里只有精品首页 | 波多野结衣中文字幕久久 | 久久精品国产一区二区三区不卡 | 嫩草影院在线观看精品视频 | 亚洲精品国产一区二区三 | 免费h| 国产成人毛片毛片久久网 | 精品一区二区三区四区五区 | 动漫一级毛片 | 男女小视频在线观看 | 亚洲人网站| 久久精品天堂 | 午夜欧美视频 | 国产成在线观看免费视频成本人 | 亚洲综合精品一区二区三区中文 | 欧美在线一级精品 | 亚洲成av人影片在线观看 | 免费人成在线观看视频色 | 日韩精品一区二区三区四区 | 欧美日韩视频一区二区三区 | 五月婷婷视频在线 | 欧美xx网| 国产精品久久久视频 | 毛片网站网址 | 综合久久一区二区三区 | 中文字幕在线观看一区二区三区 | 亚洲在线观看网站 | freexxx性乌克兰xxx | 亚洲精品日韩在线一区 | 免费a级作爱片免费观看中 免费a网站 | 亚欧成人毛片一区二区三区四区 | 伊人青青操 | h小视频在线 | 尤物视频在线观看免费 | 国产精品视频分类一区 | 337p欧洲亚洲大胆艺术 | 日本高清www视频在线观看 | 国产国语一级毛片 | 717影院理论午夜伦不卡久久 |