unix XSI IPC-消息队列例程
admin
2023-02-04 19:20:02
0次

注意事项:

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. { 
  8.       int queid = open_msg("/root",100); 
  9.        
  10.       while(1) 
  11.       { 
  12.             fputs("请输入要发送的类型:1 or 2\n", stdout); 
  13.             int type; 
  14.             scanf("%d",&type); 
  15.              
  16.             switch(type) 
  17.             { 
  18.                   case MYTYPE_ONE: 
  19.                        { 
  20.                               msg_send(queid,"MYTYPE_ONE", MYTYPE_ONE); 
  21.                               break; 
  22.                        } 
  23.                   case MYTYPE_TWO: 
  24.                        { 
  25.                               msg_send(queid,"MYTYPE_TWO", MYTYPE_TWO); 
  26.                               break; 
  27.                        } 
  28.                   default: 
  29.                         { 
  30.                               fputs("输入类型错误,请重新输入\n",stdout); 
  31.                               break; 
  32.                         }                   
  33.              
  34.             } 
  35.              
  36.             fputs("输入:q 为退出,其它表示继续\n",stdout); 
  37.             if(getchar() == 'q') 
  38.             { 
  39.                   fputs("退出成功!\n",stdout); 
  40.                   break; 
  41.             } 
  42.             else 
  43.             { 
  44.                   fputs("继续发送消息\n",stdout); 
  45.             }      
  46.       } 
  47. //不发送退出需要奖队列移除       
  48.       del_que(queid); 
  49.        
  50.       return 0; 
  51. } 



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. { 
  8.       int queid = open_msg("/root",100); 
  9.        
  10.       while(1) 
  11.       { 
  12.             fputs("请接收要发送的类型:1 or 2\n", stdout); 
  13.             int type; 
  14.             scanf("%d",&type); 
  15.              
  16.             switch(type) 
  17.             { 
  18.                   case MYTYPE_ONE: 
  19.                        { 
  20.                               msg_rec(queid,MYTYPE_ONE); 
  21.                               break; 
  22.                        } 
  23.                   case MYTYPE_TWO: 
  24.                        { 
  25.                               msg_rec(queid,MYTYPE_TWO); 
  26.                               break; 
  27.                        } 
  28.                   default: 
  29.                         { 
  30.                               fputs("输入类型错误,请重新输入\n",stdout); 
  31.                               break; 
  32.                         }                   
  33.              
  34.             } 
  35.              
  36.             fputs("输入:q 为退出,其它表示继续\n",stdout); 
  37.             if(getchar() == 'q') 
  38.             { 
  39.                   fputs("退出成功!\n",stdout); 
  40.                   break; 
  41.             } 
  42.             else 
  43.             { 
  44.                   fputs("继续发送消息\n",stdout); 
  45.             }      
  46.       } 
  47. //队列移除       
  48.       del_que(queid); 
  49.        
  50.       return 0; 
  51. } 




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. { 
  14.       //获取IPC对象的一个键 
  15.       key_t key = ftok(path, id); 
  16.       if(-1 == key) 
  17.       { 
  18.             perror("ftok\n"); 
  19.             exit(1); 
  20.       } 
  21.       //创建一个队列 
  22.       int queid = msgget(key, IPC_CREAT|0666); 
  23.       if(-1 == queid) 
  24.       { 
  25.             perror("msgget\n"); 
  26.             exit(1); 
  27.       }  
  28.       return queid; 
  29. } 
  30.  
  31. //发送消息到队列 
  32. void msg_send(key_t key,char* text, long msgtype) 
  33. { 
  34.       //初始化内容 
  35.       struct MSG tmp; 
  36.       memset(&tmp,sizeof(struct MSG),0); 
  37.       tmp.mytype = msgtype; 
  38.       strcpy(tmp.mytext,text);  
  39.       //发送消息 
  40.       if(msgsnd(key, &tmp, TEXTSIZE, 0)) 
  41.       { 
  42.             perror("msgsnd\n"); 
  43.             exit(1); 
  44.       } 
  45. } 
  46.  
  47. //从消息队列获取消息并显示 
  48. void msg_rec(key_t key,long msgtype) 
  49. { 
  50.       struct MSG tmp; 
  51.       if(-1 == msgrcv(key, &tmp, TEXTSIZE, msgtype, MSG_NOERROR)) 
  52.       { 
  53.             perror("msgrcv\n"); 
  54.             exit(1); 
  55.       } 
  56.       printf("receive content: %s\n",tmp.mytext); 
  57. } 
  58.  
  59. //删除队列,即使队列里面还有消息也一起删除 
  60. void del_que(key_t key) 
  61. { 
  62.       if(msgctl(key,IPC_RMID,NULL)) 
  63.       { 
  64.             perror("msgsnd\n"); 
  65.             exit(1);       
  66.       } 
  67. } 



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. { 
  13.       long mytype; 
  14.       char mytext[TEXTSIZE]; 
  15. }; 
  16.  
  17. int open_msg(char*,int); 
  18. void msg_send(key_t,char*,long); 
  19.  
  20.  
  21. #endif // end MSG_H 

 

附件:http://down.51cto.com/data/2362206

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...