日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

Linux消息隊列實踐(1)

來源:程序員人生   發布時間:2014-12-08 08:22:08 閱讀次數:2662次

消息隊列基本概念

    消息隊列提供了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個數據結構

[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. };  

 

消息隊列在內核中的表示


消息隊列函數示例

msgget函數 

功能:用來創建訪問1個消息隊列

原型:

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

參數:

    key: 某個消息隊列的名字

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

 

返回值:

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

 

編程實踐

[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐1:  IPC_PRIVATE:宏,值為0  
  2. int main()  
  3. {  
  4.   //IPC_PRIVATE每次創建的消息隊列的描寫符都是不同的!  
  5.   //因此,計時MessageID(key)傳送給其他進程(除非有關聯的進程),  
  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創建的消息隊列,只能用在與當前進程有關系的進程中使用! 
  26. */  


[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //實踐2:  IPC_CREAT  
  2. int main()  
  3. {  
  4.     //指定IPC_CREAT,則1定會創建消息隊列  
  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:低權限創建,高權限打開  
  2. int main()  
  3. {  
  4.     //低權限創建  
  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函數參數關系圖

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩精品一区在线 | 国产成人在线一区 | 91精品久久久久久久99蜜桃 | 国产精品久久久久久久电影 | 成人在线黄色电影 | 国产精品久久久久久 | 国产成人精品久久久 | 91精品国产色综合久久 | 韩日av网站 | 国产精品福利片 | 中文字幕一级 | 国产精选久久久 | 亚洲国产一区二区视频 | 国产不卡视频一区二区三区 | 国产资源精品 | 亚洲日韩视频 | 伊人av在线 | 国产精品不卡视频 | 超碰中文字幕 | 国产精品九九 | 色一乱一伦一图一区二区精品 | 黄网入口| 久久久久久国产精品 | 亚洲综合精品 | 四季久久免费一区二区三区四区 | 成人av网址在线 | 国产精品电影网 | 国产毛片精品 | 欧美大片一区 | 国产一区二 | 91精品成人 | 国产精品美女在线观看 | av成人在线播放 | 自拍偷拍第5页 | 亚洲最新在线 | 国产日产欧美一区二区 | 国产精品视频一区二区三区四 | 国产精品久久久久久久久久久久 | 欧美一区二区三区视频 | 日韩免费黄色大片 | 国产激情 |