进程通信 中科大软件学院. 消息队列 消息队列提供了一种由一个进程向另一个进程发送块数据 的方法。另外,每一个数据块被看作有一个类型,而接收 进程可以独立接收具有不同类型的数据块。 消息队列定义如下: #include int msgget(key_t key, int msgflg); int msgrcv(int.

Slides:



Advertisements
Similar presentations
首 页 首 页 上一页 下一页 本讲内容 投影法概述三视图形成及其投影规律平面立体三视图、尺寸标注 本讲内容 复习: P25~P31 、 P84~P85 作业: P7, P8, P14[2-32(2) A3 (1:1)]
Advertisements

纺纱学. 2 绪 论 基本要求:了解纺纱系统的类别 重点掌握:棉纺系统的工艺流程 3 一、纺纱原理与设备 纺纱:用物理或机械的方法将纺织纤维纺成纱 线的过程。 纺纱原理:初加工、原料的选配、开松除杂、 混和、梳理、精梳、并合、牵伸、加捻、卷绕等。 纺纱方法:传统纺纱方法、新型纺纱方法。 纺纱设备:开清棉联合机、梳棉机、精梳机、
一、统计范围 注册地在湖里区的具有房地产开发资质的 房地产开发企业 无论目前是否有开发项目 无论开发的项目是在湖里区还是在其他区 没有开发项目的企业需要报送年报和月报 中的资金表(空表)。 新成立的项目公司,要先入库,再报报表。
第十二章 常微分方程 返回. 一、主要内容 基本概念 一阶方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程.
概率统计( ZYH ) 节目录 3.1 二维随机变量的概率分布 3.2 边缘分布 3.4 随机变量的独立性 第三章 随机向量及其分布 3.3 条件分布.
第 12 章位运算 C 语言兼具高级语言及低级语言的特性,因此 适合编写系统软件。 C 语言具备低级语言的特性 就在于它能直接对硬件进行操作,即位运算。 所谓位运算是指,按二进制位进行的运算。 例如,将一个存储单元中各二进位左移或右移一 位等。
第二节 Flash 动态按钮的制作 铁王中学 王东强 学习目标: 1 、了解 ActionScript 在交互动画中的重要作 用 2 、知道 ActionsScript 程序的组成 3 、熟练使用按钮中的 ActionScript 控制动画 播放的操作,掌握按钮的创建和使用方法,
PHPCMS 使用指南及二次开发向导 --- 系统设置篇 PHPCMS 网络培训课程 --- 系统设置篇 PHPCMS 项目部 王官庆制作 系统相关设置 1. 站点管理 2. 发布点管理 3. 系统其它设置 管理员设置 1. 角色定义 2. 管理员管理.
细分曲面 傅孝明 SA 目录 细分曲面的基本思想 两个关键问题 一些基本概念 几种简单的细分曲面算法 细分曲面方法分类.
本幻灯为医用耗材集中询价采购网上操作说明,请参考收费说明、供应厂商流程等文件 综合学习。幻灯次序按操作次序进行,可配合自身用户名对照学习。 操作人员:所有类别 操作说明:所有标 new 标志的文件,务必仔细查看。原有用户名和信息均可继续使用,新 使用人员可点击注册申请使用.
嵌入式操作系统 陈香兰 Fall 系统调用 10/27/09 嵌入式 OS 3/12 系统调用的意义  操作系统为用户态进程与硬件设备进行交互提供 了一组接口 —— 系统调用  把用户从底层的硬件编程中解放出来  极大的提高了系统的安全性  使用户程序具有可移植性.
系统调用 Embedded Operating Systems2 系统调用的意义 操作系统为用户态进程与硬件设备进行交互提 供了一组接口 —— 系统调用 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性.
C语言程序设计 第十三章 文件.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第六十二讲 ) 离散数学. 最后,我们构造能识别 A 的 Kleene 闭包 A* 的自动机 M A* =(S A* , I , f A* , s A* , F A* ) , 令 S A* 包括所有的 S A 的状态以及一个 附加的状态 s.
1 为了更好的揭示随机现象的规律性并 利用数学工具描述其规律, 有必要引入随 机变量来描述随机试验的不同结果 例 电话总机某段时间内接到的电话次数, 可用一个变量 X 来描述 例 检测一件产品可能出现的两个结果, 也可以用一个变量来描述 第五章 随机变量及其分布函数.
计算机文化基础 第 13 章 多表操作. 多表操作 以前所进行的操作中,在同一时刻只能打开一个表文 件,这是单工作区操作。但是在有些情况下,我们需要同时 了解多个表文件中的内容,例如 图 8-1 。在表文件 Stud1.DBF 中,有姓名,班级,电话三项;在 Stud2.DBF 中, 有姓名,性别,籍贯,英语四个字段。在单工作区操作方式.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十八讲 ) 离散数学. 第八章 格与布尔代数 §8.1 引 言 在第一章中我们介绍了关于集 合的理论。如果将 ρ ( S )看做 是集合 S 的所有子集组成的集合, 于是, ρ ( S )中两个集合的并 集 A ∪ B ,两个集合的交集.
第二部分 行政法律关系主体 第一节 行政主体 一、行政主体 (一)行政主体的概念 cc (二)行政主体资格含义及构成要件 CASE1CASE1\CASE2CASE2 (三)行政主体的职权和职责 1 、行政职权的概念及内容 2 、行政职权的特点 3 、行政职责.
线性代数习题课 吉林大学 术洪亮 第一讲 行 列 式 前面我们已经学习了关 于行列式的概念和一些基本 理论,其主要内容可概括为:
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第二十五讲 ) 离散数学. 定理 群定义中的条件 ( 1 )和( 2 )可以减弱如下: ( 1 ) ’ G 中有一个元素左壹适合 1 · a=a; ( 2 ) ’ 对于任意 a ,有一个元素左逆 a -1 适 合 a -1 ·
Linux 操作系统分析 主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三 421 ) Autumn 2007.
Linux 内核源代码导读 中国科学技术大学计算机系 陈香兰( 0551 - ) Spring 2009.
嵌入式操作系统 陈香兰 Spring 2006 中国科学技术大学计算机系.
第二章 随机变量及其分布 第一节 随机变量及其分布函数 一、随机变量 用数量来表示试验的基本事件 定义 1 设试验 的基本空间为 , ,如果对试验 的每一个基 本事件 ,规定一个实数记作 与之对应,这样就得到一个定义在基本空 间 上的一个单值实函数 ,称变量 为随机变量. 随机变量常用字母 、 、 等表示.或用.
第 4 章 过程与变量的作用范围. 4.1 Visual Basic 的代码模块 Visual Basic 的应用程序是由过程组成的, 过程代码存放在模块中。 Visual Basic 提供了 三类模块,它们是窗体模块、标准模块和类 模块。 窗体模块 窗体模块是大多数 Visual Basic.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 3 章 曲线拟合的最小二乘法 给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。 在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十九讲 ) 离散数学. 例 设 S 是一个集合, ρ ( S )是 S 的幂集合,集合 的交( ∩ ),并(∪)是 ρ ( S )上的两个代数运算, 于是,( ρ ( S ), ∩ ,∪) 是一个格。而由例 知.
实验三: 用双线性变换法设计 IIR 数字滤波器 一、实验目的 1 熟悉用双线性变换法设计 IIR 数字滤波器的原理与方法。 2 掌握数字滤波器的计算机仿真方法。 3 通过观察对实际心电图信号的滤波作用, 获得数字滤波的感性知 识。
外文文献检索示例. 实验目的: 掌握利用计算机网络检索外文文献的基本方法; 了解熟悉下列数据库的结构、内容并掌握其检索方 法 ; 掌握检索的主要途径:出版物( Publication )、关键 词( Keyword )、作者( Author )等。
第六章 文件管理. 程序设计中,文件是十分重要的,许多情况下, 使用文件可以高效地解决实际问题。有用的数据在后 备存储器上以文件的形式存储后,我们就可以通过文 件对数据进行访问、操作以及检索,这称为文件管理。 6.1 文件的分类 根据文件访问类型的不同,可以将文件分为三类: 顺序文件、随机文件和二进制文件。
OS 进程调度模拟演示 制作人: 钱晶 高上上. OS 进程调度模拟-实验原理 静态优先级原理 在这种方式下,系统一旦把处理机分配给就绪队 列中的优先权最高的进程后,该进程便一直执行下去, 直至完成。或因为发生某事件使该进程放弃处理机,系 统方可再将处理机分配给另一优先级最高的进程。这些 事件包括有优先级更高的进程进入,或是因为某些原因.
信息利用与学术论文写作 Library of Jiangsu University, Zhenjiang Sha Zhenjiang
操作系统原理课程设计指南 姜海燕 设计考核幻灯制作  1.1 封皮:系统名称,研制人员  1.2 目的及意义  1.3 功能设计:功能框图、用例图  1.4 结构设计:系统结构  1.5 核心技术及技术路线:画图  1.6 进度安排  1.7 人员安排  1.8.
量子化学 第四章 角动量与自旋 (Angular momentum and spin) 4.1 动量算符 4.2 角动量阶梯算符方法
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 5 章 解线性方程组的直接法 实际中,存在大量的解线性方程组的问题。很多数值方 法到最后也会涉及到线性方程组的求解问题:如样条插值的 M 和.
在发明中学习 线性代数 概念的引入 李尚志 中国科学技术大学. 随风潜入夜 : 知识的引入 之一、线性方程组的解法 加减消去法  方程的线性组合  原方程组的解是新方程的解 是否有 “ 增根 ” ?  互为线性组合 : 等价变形  初等变换  高斯消去法.
第一节 相图基本知识 1 三元相图的主要特点 (1)是立体图形,主要由曲面构成; (2)可发生四相平衡转变; (3)一、二、三相区为一空间。
第5章 键盘与鼠标接口 5.1 键盘概述 5.2 键盘的工作原理 5.3 PC扩展键盘接口 5.4 键盘中断与键盘I/O 5.5 鼠标接口.
9的乘法口诀 1 .把口诀说完全。 二八( ) 四六( ) 五八( ) 六八( ) 三七( ) 三八( ) 六七( ) 五七( ) 五六( ) 十六 四十八 四十二 二十四 二十一 三十五 四十 二十四 三十 2 .口算, 并说出用的是哪句口诀。 8×8= 4×6= 7×5= 6×8= 5×8=
量子力学教程 ( 第二版 ) 3.4 连 续 谱 本 征 函 数 的 归 一 化 连续谱本征函数是不能归一化的 一维粒子的动量本征值为的本征函数 ( 平面波 ) 为 可以取 中连续变化的一切实数值. 不难看出,只要则 在量子力学中, 坐标和动量的取值是连续变化 的 ; 角动量的取值是离散的.
湖南省赛宝软件服务有限公司 信息报送及申报系统演示 湖南省赛宝软件服务有限公司 李纠.
第 3 章 控制流分析 内容概述 – 定义一个函数式编程语言,变量可以指称函数 – 以 dynamic dispatch problem 为例(作为参数的 函数被调用时,究竟执行的是哪个函数) – 规范该控制流分析问题,定义什么是可接受的控 制流分析 – 定义可接受分析在语义模型上的可靠性 – 讨论分析算法.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第五十三讲 ) 离散数学. 定义 设 G= ( V , T , S , P ) 是一个语法结构,由 G 产生的语言 (或者说 G 的语言)是由初始状态 S 演绎出来的所有终止符的集合, 记为 L ( G ) ={w  T *
编译原理总结. 基本概念  编译器 、解释器  编译过程 、各过程的功能  编译器在程序执行过程中的作用  编译器的实现途径.
周期信号的傅里叶变换. 典型非周期信号 ( 如指数信号, 矩形信号等 ) 都是满足绝对可 积(或绝对可和)条件的能量信号,其傅里叶变换都存在, 但绝对可积(或绝对可和)条件仅是充分条件, 而不是必 要条件。引入了广义函数的概念,在允许傅里叶变换采用 冲激函数的前提下, 使许多并不满足绝对可积条件的功率.
陈香兰 助教:毛熠璐、吴昊 Spring 2008 嵌入式操作系统 陈香兰 助教:毛熠璐、吴昊 Spring 2008.
 符号表  标识符的作用: 声明部分:定义了各种对象及对应的属性和 使用规则。 程序体:对所定义的对象进行各种操作。 $ididname IdnameAttributeIR  必要性 Token : 新表-符号表(种类、类型等信息):
Linux 操作系统分析 主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三 421 ) Autumn 2007.
Department of Mathematics 第二章 解析函数 第一节 解析函数的概念 与 C-R 条件 第二节 初等解析函数 第三节 初等多值函数.
1 第 7 章 存储过程、触发器和程序包 在很多时候,都需要保存 PL/SQL 程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的 PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的 PL/SQL 程序块。
系统介绍 一 二 系统登录 三 使用流程 四 信息维护 系统介绍 根据中国政府与有关国家政府签署的相互出具《最终用户和最终 用途说明》的协议,为了便利企业申办《最终用户和最终用途说 明》, 商务部机电和科技产业司委托中国国际电子商务中心开发了 《最终用户和最终用途说明》申请系统,企业可通过此系统填写.
网上预约集港操作指南 一、登录系统 登陆下面图片显示网址:输入堆场用户名、密码和校验码登陆系统.
首 页 首 页 上一页 下一页 本讲内容本讲内容 视图,剖视图(Ⅰ) 复习: P107 ~ P115 作业: P48(6-2,6-4), P49( 去 6-6) P50, P51(6-13), P52 P50, P51(6-13), P52 P53 (6-18,6-20) P53 (6-18,6-20)
学生成长成才导图填报指南 填报网址:
《 UML 分析与设计》 交互概述图 授课人:唐一韬. 知 识 图 谱知 识 图 谱知 识 图 谱知 识 图 谱.
刘相兵 (Maclean Liu) 介绍 dbms_registry PL/SQL 程序包.
1 、如果 x + 5 > 4 ,那么两边都 可得 x >- 1 2 、在- 3y >- 4 的两边都乘以 7 可得 3 、在不等式 — x≤5 的两边都乘以- 1 可得 4 、将- 7x — 6 < 8 移项可得 。 5 、将 5 + a >- 2 a 移项可得 。 6 、将- 8x < 0.
项目七: PLC 功能指令应用 带进位循环左移指令 XXXXX. 项目七: PLC 功能指令应用 FX2 系列可编程控制器移位控制指令有移位、循环移位、字移位 及先进先出 FIFO 指令等 10 条指令。 带进位循环右移指令 RCR 带进位循环左移指令 RCL 字右移位指令 WSFR 先入先出读出指令.
§10.2 对偶空间 一、对偶空间与对偶基 二、对偶空间的有关结果 三、例题讲析.
企业产品标准信息公共服务平台 操作介绍 目录 一 、系统架构介绍 二 、企业产品标准自我声明填报系统 三 、企业产品标准公示系统.
表单自定义 “ 表单自定义 ” 功能是用于制作表单的 工具,用数飞 OA 提供的表单自定义 功能能够快速制作出内容丰富、格 式规范、美观的表单。
力的合成 力的合成 一、力的合成 二、力的平行四边形 上一页下一页 目 录 退 出. 一、力的合成 O. O. 1. 合力与分力 我们常常用 一个力来代替几个力。如果这个 力单独作用在物体上的效果与原 来几个力共同作用在物体上的效 果完全一样,那么,这一个力就 叫做那几个力的合力,而那几个 力就是这个力的分力。
1 分组密码 : 分组密码的工作模式 《现代密码学》第 4 章 (3). 2 本节主要内容 1 、分组密码的工作模式 2 、 Block Modes ECB, CBC 3 、 Stream Modes CFB, OFB.
逻辑设计基础 1 第 7 章 多级与(或)非门电路 逻辑设计基础 多级门电路.
感谢您的关注 联系电话: – 677 手机: QQ :
人 有 悲 欢 离 合, 月有阴晴圆缺。月有阴晴圆缺。 华师大版七年级数学第二册 海口市第十中学 数学组 吴锐.
§5.6 利用希尔伯特 (Hilbert) 变换 研究系统的约束特性 希尔伯特变换的引入 可实现系统的网络函数与希尔伯特变换.
1 第三章 数列 数列的概念 考点 搜索 ●数列的概念 ●数列通项公式的求解方法 ●用函数的观点理解数列 高考 猜想 以递推数列、新情境下的 数列为载体, 重点考查数列的通 项及性质, 是近年来高考的热点, 也是考题难点之所在.
目录 上页 下页 返回 结束 二、无界函数反常积分的审敛法 * 第五节 反常积分 无穷限的反常积分 无界函数的反常积分 一、无穷限反常积分的审敛法 反常积分的审敛法  函数 第五章 第五章.
LOGO s 数控机床故障诊断与维修. 子项目 8 掌握 M 、 T 代码的工作原理并进行控制 冷却、转速、刀库等 。 任务 8.2 编制并运行斗笠式换刀子程序.
Presentation transcript:

进程通信 中科大软件学院

消息队列 消息队列提供了一种由一个进程向另一个进程发送块数据 的方法。另外,每一个数据块被看作有一个类型,而接收 进程可以独立接收具有不同类型的数据块。 消息队列定义如下: #include int msgget(key_t key, int msgflg); int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msgget ()函数 创建或访问一个消息队列,系统调用 msgget() 中的第一个参数是关 键字值(通常是由 ftok() 返回的)。这时,打开和存取操作是和参数 msgflg 中的内容相关的。

msgget ()函数 实例: if((key=ftok(".",'a'))==-1){ perror("ftok"); exit(1); } qid=msgget( key, IPC_CREAT | 0666 ) ; /* 创建一个消息队列 */ if ( qid < 0 ) { /* 创建一个消息队列失败 */ perror ( "msgget" ); exit (1) ; } printf ("created queue id : %d \n", qid ); /* 输出消息队列的 ID */

msgget ()函数 key_t ftok( char * fname, int id ) fname 为指定的文件名 id 为子序号 实例: if((key=ftok(".",'a'))==-1){ perror("ftok"); exit(1); }

msgget ()函数

msgget( key, IPC_CREAT | 0666 ) ; 第二位 : 当前用户的权限 :6=110( 二进制 ), 每一位分 别对应可读, 可写, 可执行,,6 说明当前用户可读可 写不可执行 第三位 :group 组用户,6 的意义同上 第四位 : 其它用户, 每一位的意义同上,0 表示不可读 不可写也不可执行

读写消息队列 系统为这个数据类型提供了两个接口( msgsnd 函数, msgrcv 函数),分别对应写消息 队列及读消息队列。将一个新的消息写入队列, 使用函数 msgsnd ,函数原型如下: #include int msgsnd ( int msqid, const void *prt, size_t nbytes, int flags); int msgrcv ( int msqid, struct msgbuf *ptr, size_t nbytes, long type, int flag);

读写消息队列 每个消息都类似如下的数据结构: struct msgbuf { long mtype; char mtext[1]; }; struct msgbuf { long mtype; char mtext[1]; }; mtype 成员代表消息类型,从消息队列中读取消息的一个重要依据就 是消息的类型; mtext 是消息内容,当然长度不一定为 1 。因此,对于 发送消息来说,首先预置一个 msgbuf 缓冲区并写入消息类型和内容, 调用相应的发送函数即可;对读取消息来说,首先分配这样一个 msgbuf 缓冲区,然后把消息读入该缓冲区即可。 以下为一读取消息队列实例:

发送方: struct msg{ /* 声明消息结构体 */ long msg_types; /* 消息类型成员 */ char msg_buf[511]; /* 消息 */ }; int main( void ) { int qid; int pid; int len; struct msg pmsg; /* 一个消息的结构体变量 */ pmsg.msg_types = getpid(); /* 消息类型为当前进程的 ID*/ sprintf (pmsg.msg_buf,"hello!this is :%d\n\0", getpid() ); /* 初始化消息 */ len = strlen ( pmsg.msg_buf ); /* 取得消息长度 */ if ( (qid=msgget(IPC_PRIVATE, IPC_CREAT | 0666)) < 0 ) { /* 创建一个消 息队列 */ perror ( "msgget" ); exit (1) ; } if ( (msgsnd(qid, &pmsg, len, 0 )) < 0 ){ /* 向消息队列中发送消息 */ perror ( "msgsn" ); exit ( 1 ); } printf ("successfully send a message to the queue: %d \n", qid); exit ( 0 ) ; }

接收方: struct msg{ /* 声明消息结构体 */ long msg_types; /* 消息类型成员 */ char msg_buf[511]; /* 消息 */ }; int main( int argc, char * argv[] ) { int qid; int len; struct msg pmsg; if ( argc != 2 ){ /**/ perror ( "USAGE: read_msg " ); exit ( 1 ); } qid = atoi ( argv[1] ); /* 从命令行中获得消息队列的 ID*/

/* 从指定队列读取消息 */ len = msgrcv ( qid, &pmsg, BUFSZ, 0, 0 ); if ( len > 0 ){ pmsg.msg_buf[len] = '\0'; /* 为消息添加结束符 */ printf ("reading queue id :%05ld\n", qid ); /* 输出队列 ID*/ /* 该消息类型就是发送消息的进程 ID*/ printf ("message type : %05ld\n", pmsg.msg_types ); printf ("message length : %d bytes\n", len ); /* 消息长度 */ printf ("mesage text: %s\n", pmsg.msg_buf); /* 消息内容 */ } else if ( len == 0 ) printf ("have no message from queue %d\n", qid ); else { perror ( "msgrcv"); exit (1); } system("ipcs -q") ; exit ( 0 ) ; }

读写消息队列

msgctl ()函数 函数 msgctl 可以在队列上做多种操作,函数原型 如下: #include int msgctl( int msqid, int cmd, struct msqid_ds *buf ); 参数 msqid 为指定的要操作的队列, cmd 参数指定 所要进行的操作,其中有些操作需要 buf 参数。 cmd 参数的详细取值及操作如下:

cmd 操 作 IPC_ST AT 取队列的 msqid_ds 结构,将它存放在 buf 所指向的结构中 (需要 buf 参数) IPC_SE T 使用 buf 所指向结构中的值对当前队列的相关结构成员赋值, 其中包括: msg_perm.uid 、 msg_perm.gid 、 msg_perm.mode 以及 msg_perm.cuid 。该命令只能由具有 以下条件的进程执行:进程有效用户 ID 等于 msg_perm.cuid 或 msg_perm.uid 超级用户进程。其中只有 超级用户才可以增加队列的 msg_qbytes 的值 IPC_RM ID 删除队列,并清除队列中的所有消息。此操作会影响后续 进程对这个队列的相关操作。该命令只能由具有以下条件 的进程执行。进程有效用户 ID 等于 msg_perm.cuid 或 msg_perm.uid ,超级用户进程 msgctl ()函数

删除消息队列: int main ( int argc,char *argv[] ) { int qid ; if ( argc != 2 ){ /* 命令行参数出错 */ puts ( "USAGE: del_msgq.c " ); exit ( 1 ); } qid = atoi ( argv[1] ); /* 通过命令行参数得到组 ID */ system( "ipcs -q"); if ( ( msgctl( qid, IPC_RMID, NULL ) ) < 0 ){ /* 删除指定的消息队列 */ perror ("msgctl"); exit (1 ); } exit( 0 ); } msgctl ()函数

实验内容 用消息队列实现的简单聊天程序 实验报告提交内容: 1 、程序流程图 2 、程序代码 3 、运行结果 接收作业邮箱: