消息队列通信实验报告总结
实验目的
1、了解什么是消息、消息队列2、掌握消息传送的机理
msgget
作用:创建消息队列
原型:int msgget(key_t key, int msgflag)
参数:key:键值 IPC_PRIVATE
msgflag:权限
返回值:成功:消息队列ID
出错:-1
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
错误:
msgsnd
作用:写数据到消息队列
原型:int msgsnd(int msgid, const void *msggp, size_t msgsize, int msgflg)
参数:msgid消息队列标识符
msggp 消息结构
例如下:
struct msgtype
{
long mtype; /消息类型/
char mtext[256]; /消息正文/
}
msgsize,字节数
msgflg,标识符分类如下
0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列
IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回
IPC_NOERROR:若发送的消息大于size字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
错误:
msgrcv
作用:从消息队列中读数据
原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, intmsgflg)
参数:msqid:消息队列标识符
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如上方的msggp
msgsz:消息的大小。
msgtyp:消息类型
msgtyp等于0 则返回队列的最早的一个消息
msgtyp大于0,则返回其类型为mtype的第一个消息
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息
错误:
msgctl
作用:控制消息队列
原型:int msggctl(intmsgid, int cmd, struct msgid_ds *buf)
参数:msgid 消息队列ID
cmd 命令参数
IPC_STAT 读取消息队列的数据结构, IPC_SET设置消息队列数据结构msgid_ds中的IPC操作权限、 IPC_RMID从系统内核汇总删除消息队列
返回值: 成功 0
出错-1
头文件: #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
错误:
所作实验代码
要求
将server程序设置为能够并发处理多个客户的程序(参考下图的程序结构),服务器无限循环,CTRL+C结束,设计捕捉信号,信号处理中删除消息队列,服务器收到客户机的消息后发给不同客户机不同的应答消息(内容自定)。
server
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include <string.h>
#include<signal.h>
#define MSGKEY 75struct msgform
{long mtype;char mtext[256];
};
int msgid;
void stop(int a){printf("server will stop in one second\n");sleep(1);msgctl(msgid,IPC_RMID,0);exit(0);}
int main()
{int pid;if( (pid = fork()) == -1){perror("fork");exit(EXIT_FAILURE);}else if ( pid == 0) //子进程{struct msgform msg1,msg2;msgid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列,操作权为可读、写、执行*/while(1){sleep(2);msgrcv(msgid,(void *) &msg1,256,1,0); /*接收flag==1消息*/printf("server receive client 1:%s",msg1.mtext); strcpy(msg2.mtext,"server received!");msg2.mtype=1;msgsnd(msgid,&msg2,256,0); /*发送消息*/}}else //父进程{ if((pid=fork())==-1){perror("fork");exit(0);}else if(pid==0){//second childstruct msgform msg1,msg2;msgid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列,操作权为可读、写、执行*/while(1){sleep(2);msgrcv(msgid,(void *) &msg1,256,2,0); /*接收flag==2消息*/printf("server receive client 2:%s",msg1.mtext); strcpy(msg2.mtext,"server received!");msg2.mtype=2;msgsnd(msgid,&msg2,256,0); /*发送消息*/}}else{printf("press ctrl+c exit!!!\n");signal(SIGINT,stop); while(1);}}
}
client
有两个client,代码一致
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#define MSGKEY 75
struct msgform
{long mtype; /*消息类型*/char mtext[256]; /*消息正文*/
};
int msgid;
int main()
{ char buffer[256];struct msgform msg1,msg2;int msgid,pid,*pint;msgid=msgget(MSGKEY, 0777); /*打开消息队列*/printf("Enter the mssage to send:");fgets(msg1.mtext,156,stdin);msg1.mtype = 1;msgsnd(msgid,&msg1,256,0); /*发送消息*/msgrcv(msgid,&msg2,256,1,0); /*接收类型为2的消息*/printf("receive from server: %s\n",msg2.mtext);
}
运行结果
消息队列通信实验报告总结相关推荐
- Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结
Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...
- 利用三层交换机实现VLAN的通信实验报告
利用三层交换机实现VLAN的通信实验报告<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...
- linux.调整收发队列,linux消息队列通信
程序目的:学习linux消息队列通信 所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl() 首先介绍每个函数的用法: (1)msgget 使用格式: #include ...
- qt使用消息队列服务器,qt代码实现消息队列通信
qt代码实现消息队列通信 内容精选 换一换 模式介绍:命令模式(command)命令模式的解释如下:向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指 ...
- 伪随机序列调相位C语言,混沌通信实验报告范文
混沌通信实验报告范文 篇一:混沌通信实验仪实验操作步骤 实验一: 非线性电阻的伏安特性实验 1.实验目的:测绘非线性电阻的伏安特性曲线 2.实验装置:混沌通信实验仪. 3.实验对象:非线性电阻模块. ...
- 单片机双机通信c语言实验心得,单片机双机通信实验报告.doc
单片机双机通信实验报告 计算机与信息工程学院综合性实验报告 专业:物联网 年级/班级: 2015-2016学年第一学期 课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目 ...
- 计算机网络实验vc6实现串口通信,用vc的串口通信实验报告.docx
文档介绍: 编程实验报告实验题目:串口通信班级:学号:姓名:日期:2015-6-8一.实验要求把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯.可以利用高级语言.C语言编程实现,要求程 ...
- uCOSIII_消息队列-消息传递实验分析
实验内容: 创建4个任务: static void AppTaskStart(void *p_arg); static void main_task(void *p_arg); static ...
- 计算机网络与通信实验报告——HTTP协议分析
文章目录 一.实验目的 二.实验原理 三.实验过程 1.捕获访问网站的数据包 2.过滤TCP和HTTP的数据包 3.TCP三次握手 4.HTTP中同一URL的多重请求 四.总结 一.实验目的 1.熟悉 ...
最新文章
- 作业盒子完成1.5亿美元D轮融资,用AI普及教育资源
- 一个女程序员的男友需求说明书(转)
- 前端学习(1186):双向数据绑定
- leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
- 【AI 顶会】NIPS2019接收论文完整列表
- python和pycharm要安装在同一个路径下吗_无法在pyCharm中导入与Anaconda一起安装的文件:需要将Anaconda添加到Python路径吗?...
- Java与C语言混合编程
- android强制结束进程_Android完全强制退出应用程序
- CentOS 7配置Docker Storage
- AD(PCB)知识总结
- 软件项目管理期末复习---项目立项
- 服务器的类型都有哪些
- 红米android10参数,红米10x5g手机参数红米10x5g手机参数有哪些
- videojs中文文档详解_HTTP的世界观(附HTTP/3中文翻译)
- 安装SQL Server 2000时出现“以前的某个程序安装已在安装……”
- java web课设
- NAC学习笔记(手写版)
- 江苏科技大学计算机科学与工程,江苏科技大学
- 题目练习_跳骚_幸运数字_解方程
- AI、新材料、5G、智慧城市,未来的社会场景在高交会提前上演