中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unix XSI IPC-消息隊列例程

發布時間:2020-05-24 02:47:46 來源:網絡 閱讀:850 作者:xieyihua 欄目:系統運維

注意事項:

linux(2.4.22)限制:

  • 可發送最長消息字節數為8192
  • 隊列最大容量字節數 16384
  • 隊列最大隊列容量數 16

key_t ftok(char* path,int id)使用說明:

  • ftok創建一個鍵,是內核中的隊列在外部的ID號,由于消息隊列處于內核中,只有創建者和內核知道隊列在內核里面的ID號,這樣其它的進程就無法知道內核里面隊列ID號,所以要關聯一個外部鍵進行關聯
  • id (1-255)
  • 返回內核消息隊列的ID號

其它的注意就查看一下unix高級環境編程吧,或者有些問題需要討論就回我吧!!


 server.c

  1. #include "msg.h" 
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. #include <stdlib.h> 
  5.  
  6. int main(int argc, char** argv) 
  7.       int queid = open_msg("/root",100); 
  8.        
  9.       while(1) 
  10.       { 
  11.             fputs("請輸入要發送的類型:1 or 2\n", stdout); 
  12.             int type; 
  13.             scanf("%d",&type); 
  14.              
  15.             switch(type) 
  16.             { 
  17.                   case MYTYPE_ONE: 
  18.                        { 
  19.                               msg_send(queid,"MYTYPE_ONE", MYTYPE_ONE); 
  20.                               break; 
  21.                        } 
  22.                   case MYTYPE_TWO: 
  23.                        { 
  24.                               msg_send(queid,"MYTYPE_TWO", MYTYPE_TWO); 
  25.                               break; 
  26.                        } 
  27.                   default: 
  28.                         { 
  29.                               fputs("輸入類型錯誤,請重新輸入\n",stdout); 
  30.                               break; 
  31.                         }                   
  32.              
  33.             } 
  34.              
  35.             fputs("輸入:q 為退出,其它表示繼續\n",stdout); 
  36.             if(getchar() == 'q') 
  37.             { 
  38.                   fputs("退出成功!\n",stdout); 
  39.                   break; 
  40.             } 
  41.             else 
  42.             { 
  43.                   fputs("繼續發送消息\n",stdout); 
  44.             }      
  45.       } 
  46. //不發送退出需要獎隊列移除       
  47.       del_que(queid); 
  48.        
  49.       return 0; 



client.c

  1. #include "msg.h" 
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. #include <stdlib.h> 
  5.  
  6. int main(int argc, char** argv) 
  7.       int queid = open_msg("/root",100); 
  8.        
  9.       while(1) 
  10.       { 
  11.             fputs("請接收要發送的類型:1 or 2\n", stdout); 
  12.             int type; 
  13.             scanf("%d",&type); 
  14.              
  15.             switch(type) 
  16.             { 
  17.                   case MYTYPE_ONE: 
  18.                        { 
  19.                               msg_rec(queid,MYTYPE_ONE); 
  20.                               break; 
  21.                        } 
  22.                   case MYTYPE_TWO: 
  23.                        { 
  24.                               msg_rec(queid,MYTYPE_TWO); 
  25.                               break; 
  26.                        } 
  27.                   default: 
  28.                         { 
  29.                               fputs("輸入類型錯誤,請重新輸入\n",stdout); 
  30.                               break; 
  31.                         }                   
  32.              
  33.             } 
  34.              
  35.             fputs("輸入:q 為退出,其它表示繼續\n",stdout); 
  36.             if(getchar() == 'q') 
  37.             { 
  38.                   fputs("退出成功!\n",stdout); 
  39.                   break; 
  40.             } 
  41.             else 
  42.             { 
  43.                   fputs("繼續發送消息\n",stdout); 
  44.             }      
  45.       } 
  46. //隊列移除       
  47.       del_que(queid); 
  48.        
  49.       return 0; 




msg.c


  1. #include <sys/types.h> 
  2. #include <sys/ipc.h> 
  3. #include <stdio.h> 
  4. #include <stdlib.h> 
  5. #include <sys/ipc.h> 
  6. #include <sys/msg.h> 
  7. #include<string.h> 
  8. #include"msg.h" 
  9.  
  10.  
  11. //如果存在隊列則打開,沒有則創建 
  12. int open_msg(char* path, int id) 
  13.       //獲取IPC對象的一個鍵 
  14.       key_t key = ftok(path, id); 
  15.       if(-1 == key) 
  16.       { 
  17.             perror("ftok\n"); 
  18.             exit(1); 
  19.       } 
  20.       //創建一個隊列 
  21.       int queid = msgget(key, IPC_CREAT|0666); 
  22.       if(-1 == queid) 
  23.       { 
  24.             perror("msgget\n"); 
  25.             exit(1); 
  26.       }  
  27.       return queid; 
  28.  
  29. //發送消息到隊列 
  30. void msg_send(key_t key,char* text, long msgtype) 
  31.       //初始化內容 
  32.       struct MSG tmp; 
  33.       memset(&tmp,sizeof(struct MSG),0); 
  34.       tmp.mytype = msgtype
  35.       strcpy(tmp.mytext,text);  
  36.       //發送消息 
  37.       if(msgsnd(key, &tmp, TEXTSIZE, 0)) 
  38.       { 
  39.             perror("msgsnd\n"); 
  40.             exit(1); 
  41.       } 
  42.  
  43. //從消息隊列獲取消息并顯示 
  44. void msg_rec(key_t key,long msgtype) 
  45.       struct MSG tmp; 
  46.       if(-1 == msgrcv(key, &tmp, TEXTSIZE, msgtype, MSG_NOERROR)) 
  47.       { 
  48.             perror("msgrcv\n"); 
  49.             exit(1); 
  50.       } 
  51.       printf("receive content: %s\n",tmp.mytext); 
  52.  
  53. //刪除隊列,即使隊列里面還有消息也一起刪除 
  54. void del_que(key_t key) 
  55.       if(msgctl(key,IPC_RMID,NULL)) 
  56.       { 
  57.             perror("msgsnd\n"); 
  58.             exit(1);       
  59.       } 



msg.h


  1. #ifndef MSG_H 
  2. #define MSG_H 
  3.  
  4. #include <sys/types.h> 
  5.  
  6. #define TEXTSIZE 100 
  7. #define ARRYSIZE 2 
  8. #define MYTYPE_ONE 1 
  9. #define MYTYPE_TWO 2 
  10.  
  11. struct MSG 
  12.       long mytype; 
  13.       char mytext[TEXTSIZE]; 
  14. }; 
  15.  
  16. int open_msg(char*,int); 
  17. void msg_send(key_t,char*,long); 
  18.  
  19.  
  20. #endif // end MSG_H 

 

附件:http://down.51cto.com/data/2362206
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

农安县| 敦煌市| 黄梅县| 上思县| 五原县| 罗江县| 长春市| 金川县| 灵寿县| 宜城市| 宜章县| 武乡县| 丹巴县| 陆川县| 康马县| 屯门区| 东莞市| 增城市| 山丹县| 名山县| 荔波县| 新蔡县| 新民市| 临汾市| 贺兰县| 岑溪市| 望城县| 广平县| 边坝县| 肥城市| 青海省| 郎溪县| 肃南| 山阳县| 武隆县| 固镇县| 托里县| 旌德县| 滨州市| 工布江达县| 抚州市|