unix XSI IPC-消息队列例程
发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,注意事项:linux(2.4.22)限制:可发送最长消息字节数为8192队列最大容量字节数 16384队列最大队列容量数 16key_t ftok(char* path,int id)使用说明:fto
千家信息网最后更新 2024年11月15日unix XSI IPC-消息队列例程
注意事项:
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
队列
消息
输入
内核
类型
最大
成功
字节
容量
错误
关联
最长
高级
事项
使用说明
内容
创建者
只有
对象
注意事项
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
罗马字体软件开发
苹果退出登录是服务器出错
设置服务器配置
软件开发和it比较好
全国网络安全大赛是什么意思
今日头条软件开发招聘
日期和时间服务器同步出错
数据库操作语句指
页面上如何获取数据库连接
怎样知道对面服务器端口
旧服数据库
西安自己开发小程序需要服务器么
北碚交警队网络技术支撑
网络安全检查措施
巴东聚隆网络技术服务
从数据库中复制数据结构
戴尔机架式服务器 改水冷
qq发送邮件服务器地址
山东中职计算机网络技术教材
网络安全法 三十三
数据库软件未连接
钉钉消息撤回服务器会有记录吗
河北天泰软件开发有限公司
今日头条软件开发招聘
大学生网络安全500字
数据库邮件测试
数据库安全环境的催弱性的例子
软件开发 丁二玉
武汉新华电脑培训学校学软件开发
山东中职计算机网络技术教材