unix XSI IPC-消息队列例程

  • 来源:网络
  • 更新日期:2020-07-27

摘要:系统运维 注意事项: linux(2.4.22)限制: 可发送最长消息字节数为8192 队列最大容量字节数 16384 队列最大队列容量数 16

系统运维

注意事项:

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

新网虚拟主机