unix XSI IPC-消息队列例程
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,注意事项:linux(2.4.22)限制:可发送最长消息字节数为8192队列最大容量字节数 16384队列最大队列容量数 16key_t ftok(char* path,int id)使用说明:fto
千家信息网最后更新 2025年12月01日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安全错误
数据库的锁怎样保障安全
mysql数据库时间对齐
计算机网络技术实验考试
科技互联网分析
数据库闪回技术注意要点
请求报文的服务器地址
用数据库做服务器
网络安全信息发布研讨会
凯淳实业软件开发是外包吗
慧帮科技互联网基础
日租卡服务器免流
网络安全领域重点保护哪些领域
mysql数据库突然启动不
互联网电视连接不上服务器
物流aoi明细数据库
2035年网络安全构想
法院网络安全通报
腾讯软件开发平台
软件开发市场规模及增长趋势
无盘服务器系统下载
数据库窗口怎么设置有效文本
fg数据库
2b2t服务器收费
工业软件开发哪家好
桔火网络技术 刘映雪
云上网络安全教程
安卓手机怎么打印服务器
中级数据库
苹果管理软件开发商
重力感应无人售货柜软件开发
静安区互联网络技术服务方案