鸿 网 互 联 www.68idc.cn

unix XSI IPC-消息队列例程推荐

来源:互联网 作者:佚名 时间:2018-01-22 09:11
ftok创建一个键,是内核中的队列在外部的ID号,由于消息队列处于内核中,只有创建者和内核知道队列在内核里面的ID号,这样其它的进程就无法知道内核里面队列ID号,所以要关联一个外部键进行关联 id (1-255) 返回内核消息队列的ID号 server.c #include msg.
ftok创建一个键,是内核中的队列在外部的ID号,由于消息队列处于内核中,只有创建者和内核知道队列在内核里面的ID号,这样其它的进程就无法知道内核里面队列ID号,所以要关联一个外部键进行关联 id (1-255) 返回内核消息队列的ID号

 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

网友评论
<