为了账号安全,请及时绑定邮箱和手机立即绑定

unix XSI IPC-消息队列例程

标签:
Linux


注意事项:

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

#include "msg.h" 

#include <stdio.h> 

#include <string.h> 

#include <stdlib.h> 

 

int main(int argc, char** argv) 

      int queid = open_msg("/root",100); 

       

      while(1) 

      { 

            fputs("请输入要发送的类型:1 or 2\n", stdout); 

            int type; 

            scanf("%d",&type); 

             

            switch(type) 

            { 

                  case MYTYPE_ONE: 

                       { 

                              msg_send(queid,"MYTYPE_ONE", MYTYPE_ONE); 

                              break; 

                       } 

                  case MYTYPE_TWO: 

                       { 

                              msg_send(queid,"MYTYPE_TWO", MYTYPE_TWO); 

                              break; 

                       } 

                  default: 

                        { 

                              fputs("输入类型错误,请重新输入\n",stdout); 

                              break; 

                        }                   

             

            } 

             

            fputs("输入:q 为退出,其它表示继续\n",stdout); 

            if(getchar() == 'q') 

            { 

                  fputs("退出成功!\n",stdout); 

                  break; 

            } 

            else 

            { 

                  fputs("继续发送消息\n",stdout); 

            }      

      } 

//不发送退出需要奖队列移除       

      del_que(queid); 

       

      return 0; 

client.c

#include "msg.h" 

#include <stdio.h> 

#include <string.h> 

#include <stdlib.h> 

 

int main(int argc, char** argv) 

      int queid = open_msg("/root",100); 

       

      while(1) 

      { 

            fputs("请接收要发送的类型:1 or 2\n", stdout); 

            int type; 

            scanf("%d",&type); 

             

            switch(type) 

            { 

                  case MYTYPE_ONE: 

                       { 

                              msg_rec(queid,MYTYPE_ONE); 

                              break; 

                       } 

                  case MYTYPE_TWO: 

                       { 

                              msg_rec(queid,MYTYPE_TWO); 

                              break; 

                       } 

                  default: 

                        { 

                              fputs("输入类型错误,请重新输入\n",stdout); 

                              break; 

                        }                   

             

            } 

             

            fputs("输入:q 为退出,其它表示继续\n",stdout); 

            if(getchar() == 'q') 

            { 

                  fputs("退出成功!\n",stdout); 

                  break; 

            } 

            else 

            { 

                  fputs("继续发送消息\n",stdout); 

            }      

      } 

//队列移除       

      del_que(queid); 

       

      return 0; 

msg.c

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <stdio.h> 

#include <stdlib.h> 

#include <sys/ipc.h> 

#include <sys/msg.h> 

#include<string.h> 

#include"msg.h" 

 

 

//如果存在队列则打开,没有则创建 

int open_msg(char* path, int id) 

      //获取IPC对象的一个键 

      key_t key = ftok(path, id); 

      if(-1 == key) 

      { 

            perror("ftok\n"); 

            exit(1); 

      } 

      //创建一个队列 

      int queid = msgget(key, IPC_CREAT|0666); 

      if(-1 == queid) 

      { 

            perror("msgget\n"); 

            exit(1); 

      }  

      return queid; 

 

//发送消息到队列 

void msg_send(key_t key,char* text, long msgtype) 

      //初始化内容 

      struct MSG tmp; 

      memset(&tmp,sizeof(struct MSG),0); 

      tmp.mytype = msgtype; 

      strcpy(tmp.mytext,text);  

      //发送消息 

      if(msgsnd(key, &tmp, TEXTSIZE, 0)) 

      { 

            perror("msgsnd\n"); 

            exit(1); 

      } 

 

//从消息队列获取消息并显示 

void msg_rec(key_t key,long msgtype) 

      struct MSG tmp; 

      if(-1 == msgrcv(key, &tmp, TEXTSIZE, msgtype, MSG_NOERROR)) 

      { 

            perror("msgrcv\n"); 

            exit(1); 

      } 

      printf("receive content: %s\n",tmp.mytext); 

 

//删除队列,即使队列里面还有消息也一起删除 

void del_que(key_t key) 

      if(msgctl(key,IPC_RMID,NULL)) 

      { 

            perror("msgsnd\n"); 

            exit(1);       

      } 

msg.h

#ifndef MSG_H 

#define MSG_H 

 

#include <sys/types.h> 

 

#define TEXTSIZE 100 

#define ARRYSIZE 2 

#define MYTYPE_ONE 1 

#define MYTYPE_TWO 2 

 

struct MSG 

      long mytype; 

      char mytext[TEXTSIZE]; 

}; 

 

int open_msg(char*,int); 

void msg_send(key_t,char*,long); 

 

 

#endif // end MSG_H 

 

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

©著作权归作者所有:来自51CTO博客作者xieyihua的原创作品,如需转载,请注明出处,否则将追究法律责任

消息队列


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消