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.       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

相关内容

热门资讯

菲尔兹奖得主邓煜:做真正喜欢的... 文 | 《中国科学报》 记者 赵广立初次和邓煜对话是轻松的,没有被数学天才“碾压”的感受。他会耐心听...
如何抢抓6G机遇?低空怎样飞得... 7月23日,记者从双流区获悉,2026天府科学家创新发展大会暨成都科产融合对接活动双流(电子信息)专...
腾讯云官宣大规模部署国产化算力... 在2026世界人工智能大会的分论坛现场,腾讯云高管首次公开明确宣布,将大规模部署国产化算力,目标直指...
2026“光影科学梦”影视资源... 中新网北京7月23日电 (记者 孙自法)中国科技馆7月23日向媒体通报说,利用沉浸式体验的虚拟现实(...
产教共生、港数融合,解码日照数... 数字浪潮奔涌向前,人工智能与数据要素已然成为山东数字强省建设的关键变量与战略支点。近年来,山东锚定国...
原创 v... 现在的手机行业可以用“一地鸡毛”来形容了,先是魅族宣布不做手机了,如今真我有宣布退出中国市场,而红米...
谷歌现在允许用户通过自拍视频登... IT之家 7 月 23 日消息,谷歌正在推出一种新的账号登录和恢复方式,当用户无法使用传统找回方式时...
中国数学,迎来了菲尔兹时刻 14亿中国人里,必定还有无数具有数学天赋的人,要想人尽其才,那就得需要社会为他们提供一个更公平、也更...
谷歌Pixel 11/Pro/... 7 月 23 日消息,科技媒体 mymobiles 昨日(7 月 22 日)发布博文,在谷歌 8 月...
胡锡进:梁文锋倾吐衷肠,甩出美... 梁文锋近日的一个内部谈话流传到网上,引起网友的广泛追捧。它展现了中国新一代年轻科技精英的追梦情怀,对...