




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南城建学院河南城建学院 操作系统操作系统 课程设计说明书课程设计说明书 设计题目 设计题目 管道通信管道通信 专专 业 业 计算机科学与技术计算机科学与技术 指导教师 指导教师 邵国金邵国金 郭猛郭猛 薛冰薛冰 班班 级 级 0814102 学学 号 号 081410217 姓姓 名 名 金金 贺贺 同同 组组 人 人 李乾坤李乾坤 邵光光邵光光 计算机科学与工程系计算机科学与工程系 2011 年年 1 月月 10 日日 1 前言 课程设计是检测学生课程效果的重要手段 是训练学生通过所学的知识解 决实际问题的重要方式 同时也是实践性教学中的一个重要环节 它以某以课 程为基础 可以涉及和课程相关的各个方面 是一门独立于课程之外的特殊课 程 课程设计是让学生对所学的课程更全面的学习和应用 理解和掌握课程的 相关知识 操作系统 是一门重要的专业课 是计算机理论和应用的核心基础 课程 操作系统课程设计 是一次对多学知识的综合演练 要求学生在操作系统 的设计理念 整体机构 模块划分 数据结构的选择和应用 算法的设计及其 实现等方面 加深对课程基本内容的理解 同时 在课程设计方法以及上机操 作等基本技能和科学作风方面收到比较系统和严格的训练 在这次的课程设计中我们选择的题目是进程间通信消息机制的设计 实现 消息的创建 发送和接收及在 server 端创建一个服务函数 从而形成 C S 通讯 模式 消息机制是消息通过消息队列的方式进行进程间消息的传递 通过此次 课程设计 全面理解消息机制进程间通信方法 实现把死板的课本知识变得生 动有趣 激发了学生的积极性 把学过的计算机操作系统的知识强化 能够把 课堂上的知识通过自己设计的程序表示出来 加深了岁理论知识的理解目的 2 目 录 一 4 二 4 三 设计题目及要求 4 1 设计管道通信 4 2 设计命名管道 4 四 总体设计 4 五 详细设计 6 1 实现管道通信 6 2 命名管道设计 8 六 调试与测试方法 12 七 执行结果及分析 13 八 源程序清单 14 九 心得体会 19 十 参考文献 19 3 三 系统环境 1 硬件环境 Intel R Core TM 2 Duo CPU E7200 2 53GHz 1 59GHz 2 00GB 的内存 2 软件环境 Microsoft Windows XP Professtonal 版本 2002 Service Pack 3 4 四 设计目的 利用 UNIX 系统提供的管道机制实现进程间的通信 1 管道通信 利用 pipe 和 lockf 系统调用 编写程序 实现同族进程间的通信 使 用系统调用 pipe 建立一条管道线 创建子进程 P1 P2 子进程 Pi 分别向管道各写信 息 而父进程则从管道中读出来自于各子进程的信息 实现进程家族间无名管道通讯 扩展之 使之成为客户 服务器模式 并完成一定的任务 自己定义 2 命名管道通信 利用 mkfifo name mode 或 mknod name mode 0 创建一个命名管 道 然后利用它和文件部分系统调用实现不同进程间的通信 改造之 使之成为客户 服务器模式 并完成一定的任务 自己定义 5 五 总体设计 1 fork 创建一个新进程 用法 int fork 其中返回 int 取值意义如下 0 创建子进程 从子进程返回的 id 值 0 从父进程返回的子进程 id 值 1 创建失败 2 lockf files function size 用作锁定文件的某些段或者整个文件 头文件 include 参数定义 int lockf files function size int files function long size 其中 files 是文件描述符 function 是锁定和解锁 1 表示锁定 0 表示解锁 Size 是锁 定或解锁的字节数 若用 0 表示从文件的当前位置到文件尾 3 read 功能 从描述符为filedes 的文件读信息 用法 include ssize t read int filedes void buff size t nbytes 返回 读到的字节数 若已到文件尾为 0 若出错为 1 在 UNIX Linux 可重定义为 intread int fd char buff unsigned nbytes 4 write 功能 向已打开的文件写数据 用法 include ssize t write int filedes const void buff size t nbytes 返回值 若成功为已写入的字节数 出错为 1 int write int fd char buff unsigned nbytes 文件位置指针 文件位置指针 每个打开文件都有一个与其相关联的 当前位移量 是从文件开始处 计算的字节数 通常 读 写操作都从当前文件位置处开始 并使位移量增加所读或写的 字节数 按系统默认 当打开一个文件时 除非指定 O APPEND 选择项 否则该位移量被设置为 0 即指向文件的开始处 文件位置指针可以通过系统调用 lseek 来移动 5 创建 6 用 mkfifo 或 mknod 创建一个命名管道 以 mkfifo 为例 include include int mkfifo const char fifo name mode t mode 成功返回 0 否则为 1 6 signal sig function 允许调用进程控制软中断信号的处理 头文件 include 参数定义 signal sig function intsig void function 返回值 成功时返回旧的 以前 函数描述 失败时返回 SIG ERR 7 client server 可以以 client server 方式使用 FIFO 如果一个服务器有多个客户时 每个客户可通过一个 well known FIFO 服务器连接 连接后可以通过 well known FIFO 向服务器发送请求 所发 信息的长度必须 PIPE BUF 4096 流程图 初始化 创建一个 key 为 105 107 的消息队列 等待 msgqid1 发来消息 显示消息 接收消息 向 msgqid2 发送收到命令 存储到文件 7 消息的创建 发送和接收示意图消息的创建 发送和接收示意图 退出 收到 exit 命令 创建子进程 server 由关键字获得消息队列 从队列接收消息 消息类型 i 为 1 时 释放队列 删除队列表项 退出 创建成功 挂起 5 秒 删除消息队列 初始化 8 六 详细设计 1 实现管道通信 编制一段程序 实现进程的管道通信 使用系统调用 pipe 建立一条管道线 两个子进 程 p1 和 p2 分别向管道各写一句话 child 1 is sending message child 2 is sending message 而父进程则从管道中读出来自于两个子进程的信息 显示在屏幕上 include main int i r p1 p2 fd 2 char buf 50 s 50 pipe fd 创建匿名管道 fd 0 为读端 fd 1 为写端 while p1 fork 1 创建子进程 P1 直至成功为止 p1 1 if p1 0 子进程 P1 执行逻辑 lockf fd 1 1 0 锁定管道写端 保证写入数据的完整性 sprintf buf child process P1 is sending messages n 在 buf 中填入准备写入管道的信息数 据 printf child processP1 n 打印 子进程 P1 正在运行 write fd 1 buf 50 向管道写端 fd 1 写入 buf 中的数据 写完后该数据即可以从读端 fd 0 读出 sleep 5 睡眠 5 秒 lockf fd 1 0 0 解锁管道写端 exit 0 子进程 P1 退出 else 主进程的执行逻辑 while p2 fork 1 创建第二个子进程 P2 if p2 0 子进程 P2 的执行逻辑 lockf fd 1 1 0 锁定管道写端 保证数据写入完整 sprintf buf child process P2 is sending messages n 在 buf 中填入准备写入管道的信息数 据 9 printf child processP2 n 打印 子进程 P2 正在运行 write fd 1 buf 50 向管道写端 fd 1 写入 buf 中的数据 写完后该数据即可从读端 fd 0 读出 sleep 5 睡眠 5 秒 lockf fd 1 0 0 解锁管道写端 exit 0 子进程 P2 退出 以下为主进程执行逻辑 wait 0 等待某个子进程退出 if r read fd 0 s 50 1 从管道读端 fd 0 读取 P1 或者 P2 写入的数据 视哪个子进程抢 先执行到 lockf 函数 printf can t read pipe n 读取失败 打印错误信息 else printf s n s 打印出读到的信息数据 wait 0 等待第二个子进程退出 if r read fd 0 s 50 1 从管道读端 fd 0 读取出 P1 或者 P2 写入的数据 视哪个子进程 后执行到 lockf 函数 printf can t read pipe n 读取失败 打印错误信息 else printf s n s 打印读取到的信息数据 exit 0 主进程退出 2 命名管道设计 命名管道的通信例子中包括 client 端和 server 端 它们源代码文件名称分别为 fifo clt c 和 fifo svr c 还有一个公共常量的有关文件被打包在文件 fifo hd h 运行时 client 只运行一次就将退出 而 server 端作为服务器仍将继续运行 你再次启 动 client 来请求服务 FIFO 的用法 1 创建 用 mkfifo 或 mknod 创建一个命名管道 以 mkfifo 为例 include include int mkfifo const char fifo name mode t mode 成功返回 0 否则为 1 10 2 使用 管道一经创建 就可向普通文件一样使用 可通过系统调用 open close read write unlink 等进行操作 管道打开过程中 变量 O NONBLOCK 将影响打开后对文件的操作 默认情况下该变 量不设置 也就是以阻塞方式打开 这样可以保证原子性操作 因此可以不考虑该参数 在操作过程中 如果对一个管道进行写操作 write 若对方没有以读方式打开将产生 SIGPIPE 你可以捕获此信号进行处理 默认情况下是出现写错误 当最后一个写入者关 闭了管道 将产生一个文件结束标志 EOF 3 client server 可以以 client server 方式使用 FIFO 如果一个服务器有多个客户时 每个客户可通过 一个 well known FIFO 服务器连接 连接后可以通过 well known FIFO 向服务器发送请求 所发信息的长度必须 PIPE BUF 4096 如果客户服务器模式是并发型的话 则客户机不能再通过 well known FIFO 回读信息 此时可采用在已连接的客户与服务器之间建立一个私有通讯管道的办法来进行通信 该私 有管道被服务器创建后可以以 I O 方式打开 用于客户机和服务器之间进行通讯 以完成 指定性工作 头文件 define my fifo my fifo 定义头文件名 define file name server 定义头文件名 客户端程序 include include include include fifo hd h main int argc char argv int fd1 fd2 pid pid1 定义管道 charmy buf 100 charmy fil 100 charmy1buf 100 if fd1 open my fifo 1 1 11 fprintf stderr Open well known FIFO for readind Error n exit 1 失败 fprintf stderr Open s OK n my fifo pid getpid sprintf my buf 5 5d 6 6d 7 7d pid pid 10 pid 20 if write fd1 my buf 20 0 strcpy my fil file name 拷贝 strncat my fil my buf 5 fprintf stderr Send fil s n my fil sleep 2 if fd2 open my fil 2 1 fprintf stderr open s Error n my fil close fd1 exit 2 fprintf stderr open s OK n my fil if read fd2 my1buf 5 0 my1buf 5 0 fprintf stderr Read from my buf s n tmy1buf s my buf my1buf if strncmp my buf my1buf 5 0 fprintf stderr Different occurs n strcpy my buf 0000000000 write fd2 my buf 5 sleep 5 close fd2 close fd1 服务器程序 include include include include include fifo hd h voidterminate int well known id tmp id chartmp fil 100 main int argc char argv 12 int fd1 fd2 pid tpid charmy buf 100 my fil 100 my tmp 100 sprintf my buf rm f s dev null my fifo system my buf do shell cmd rm f my fifo dev null well known id tmp id 1 signal SIGINT terminate if mkfifo my fifo S IRWXU S IRWXG S IRWXO 1 fprintf stderr Create Well known FIOF Error n exit 1 创建失败 fprintf stderr mkfifo OK n fprintf stderr A New Seession I m waiting connection n loop1 输出字符串 if fd1 open my fifo 0 1 fprintf stderr Open well known FIFO for readind Error n unlink my fifo 断链接 exit 2 well known id fd1 tmp id 1 fprintf stderr open my fifo OK n if read fd1 my buf 20 0 fprintf stderr My buff s n my buf strcpy my fil file name strncat my fil my buf 5 strcpy tmp fil my fil if pid fork 0 close fd1 wait goto loop1 fprintf stderr Tmp FIFO is s n my fil if mkfifo my fil S IRWXU S IRWXG S IRWXO 1 fprintf stderr Create my fil s FIFO Error n my fil exit 1 错误 system ls server if fd2 open my fil 2 1 fprintf stderr Open s Error d n my fil fd2 close fd1 unlink my fifo exit 3 13 tmp id fd2 if write fd2 my buf 5 5 fprintf stderr Write s Error n my fil close fd2 close fd1 unlink my fil unlink my fifo exit 4 退出 sleep 1 if read fd2 my tmp 5 5 fprintf stderr read s Error n my fil close fd2 close fd1 unlink my fil unlink my fifo exit 5 退出 else if strncmp my tmp 00000 5 0 close fd2 close fd1 fprintf stderr Filed to finish talking with s n my fil unlink my fil exit 1 失败 goto loop1 else close fd2 close fd1 fprintf stderr OK to talking with s n my fil unlink my fil unlink my fifo exit 0 成功实现管道通信 void terminate if well known id 1 close well known id unlink my fifo if tmp id 1 close tmp id unlink tmp fil fprintf stderr The Server Program stoped by Signal SIGINT n exit 0 七 调试与测试 14 任务一编译方法 编译 cc liulong c 执行 a out 结果 任务二编译方法是 编译 cc o fifo svr fifo srv c cc o fifo clt fifo client c 执行 先启动 server 端程序 方法为 fifo svr 服务端 再换一个终端运行 client 端 方法是 15 fifo clt 客户端 运行时 client 只运行一次就将退出 而 server 端作为服务器仍将继续运行 你再次启 动 client 来请求服务 正常 管道实现通信 出现错误如下 服务器运行起初正常 然后当与客户端建立通信时由于客户端程序出错 导致整个通 信出现错误 16 由客户端引起的服务器程序运行出现错误 当服务器输送文件时 打开服务器出现错误继续结果一样 客户端程序运行出现错误 服务器等待通信连接 服务器程序正常运行 17 八 设计中遇到的问题及解决方法八 设计中遇到的问题及解决方法 在编写无名管道前了解到 pipe 创建的管道只能实现父子进程或者兄弟进 程之间的通信 但是还是遇到了以下几个问题 1 怎样实现不同子进程互斥 的访问管道 2 是各个子进程都写完之后父进程一起读 还是在每个子进程一 写完父进程就马上读 那么怎样去通知父进程去读呢 经过查阅相关资料得知 为解决第一个问题而引入了 lockf 函数用于实现上锁与解锁 此函数放在读 写之前执行 为解决第二问题而引入 sleep 和 wait 函数用以实现睡眠与 等待 在编写有名管道前经查阅相关资料得知用 mknod 或者 mkfifo 函数 调用创建有名管道从而实现在任意两个文件间的通信 该管道可以像普通文件 一样 read write open 由于这是个新接触的知识 以往没有练习过 所以出 现的问题较多 首先 怎样才能实现客户 服务器模式 使其可在两个终端上交 互运行 其次 怎样控制读写以及输入输出 经过查阅相关资料模仿 拷贝 小组讨论即可得出基本模块 最后使用 signal SIGINT terminate 函数发送中断 信号退出程序 经调试后最后可在机器上运行 九 源程序清单 include include include int pid1 pid2 main int fd 2 char outpipe 100 inpipe 100 pipe fd while pid1 fork 1 if pid1 0 18 lockf fd 1 1 0 sprintf outpipe child 1 process is sending message write fd 1 outpipe 50 sleep 5 lockf fd 1 0 0 exit 0 else while pid2 fork 1 if pid2 0 lockf fd 1 1 0 sprintf outpipe child 2 process is sending message write fd 1 outpipe 50 sleep 5 lockf fd 1 0 0 exit 0 else wait 0 read fd 0 inpipe 50 printf s n inpipe wait 0 read fd 0 inpipe 50 printf s n inpipe exit 0 19 头文件 define my fifo my fifo define file name server 客户端程序 include include include include fifo hd h main int argc char argv int fd1 fd2 pid pid1 charmy buf 100 charmy fil 100 charmy1buf 100 if fd1 open my fifo 1 1 fprintf stderr Open well known FIFO for readind Error n exit 1 fprintf stderr Open s OK n my fifo pid getpid sprintf my buf 5 5d 6 6d 7 7d pid pid 10 pid 20 if write fd1 my buf 20 0 strcpy my fil file name strncat my fil my buf 5 fprintf stderr Send fil s n my fil sleep 2 if fd2 open my fil 2 1 fprintf stderr open s Error n my fil close fd1 exit 2 fprintf stderr open s OK n my fil if read fd2 my1buf 5 0 my1buf 5 0 fprintf stderr Read from my buf s n tmy1buf s my buf my1buf if strncmp my buf my1buf 5 0 fprintf stderr Different occurs n 20 strcpy my buf 0000000000 write fd2 my buf 5 sleep 5 close fd2 close fd1 服务器程序 include include include include include fifo hd h voidterminate int well known id tmp id chartmp fil 100 main int argc char argv int fd1 fd2 pid tpid charmy buf 100 my fil 100 my tmp 100 sprintf my buf rm f s dev null my fifo system my buf do shell cmd rm f my fifo dev null well known id tmp id 1 signal SIGINT terminate if mkfifo my fifo S IRWXU S IRWXG S IRWXO 1 fprintf stderr Create Well known FIOF Error n exit 1 fprintf stderr mkfifo OK n fprintf stderr A New Seession I m waiting connection n loop1 if fd1 open my fifo 0 1 fprintf stderr Open well known FIFO for readind Error n unlink my fifo exit 2 well known id fd1 tmp id 1 fprintf stderr open my fifo OK n if read fd1 my buf 20 0 21 fprintf stderr My buff s n my buf strcpy my fil file name strncat my fil my buf 5 strcpy tmp fil my fil if pid fork 0 close fd1 wait goto loop1 fprintf stderr Tmp FIFO is s n my fil if mkfifo my fil S IRWXU S IRWXG S IRWXO 1 fprintf stderr Create my fil s FIFO Error n my fil exit 1 system ls server if fd2 open my fil 2 1 fprintf stderr Open s Error d n my fil fd2 close fd1 unlink my fifo exit 3 tmp id fd2 if write fd2 my buf 5 5 fprintf stderr Write s Error n my fil close fd2 close fd1 unlink my fil unlink my fifo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025劳动合同法 员工合同
- 白山事业单位笔试真题2025
- 2 整式的乘法说课稿-2025-2026学年初中数学北师大版2024七年级下册-北师大版2024
- 第3课 突破封锁线说课稿-2025-2026学年小学信息技术(信息科技)第四册下粤教版
- 3.3 紧缺的水资源说课稿-2025-2026学年初中地理晋教版八年级上册-晋教版2012
- 2025合同样本:物料与采购管理系统协议范本
- 化肥厂合同审核管理制度
- 2025合同范本:股权激励分配协议示例
- 第8课 数字化生活教学设计-2025-2026学年小学地方、校本课程浙教版人·自然·社会
- 41. See Me Skip说课稿-2025-2026学年小学英语1a典范英语(Good English)
- 表面活性剂的基本作用
- 员工网络安全责任书
- 工程建设项目审批流程图(政府投资工程建设项目(市政类线性项目))
- 消防安全周巡查记录表
- 士林变频器说明书SL
- 博雅汉语准中级加速篇1
- 第二章第一节 遗传论与环境论心理学课件
- 九年级物理上册《第十三章 内能与热机》单元检测卷及答案(沪科版)
- 能源化学与能源化工概论-第一章 能源简介
- GB/T 16866-2006铜及铜合金无缝管材外形尺寸及允许偏差
- 量子信息与量子计算课件
评论
0/150
提交评论