《操作系统实验三(进程通信)》由会员分享,可在线阅读,更多相关《操作系统实验三(进程通信)(4页珍藏版)》请在金锄头文库上搜索。
1、暨南大学本科实验报告专用纸课程名称 操作系统原理实验 成绩评定 实验项目名称 进程通信 指导教师 戴红 实验项目编号 0806002903 实验项目类型 综合型实验地点 学生姓名 蔡高成 学号 2007052431 学院 国际商学院 系 企业管理 专业 信息管理与信息系统 实验时间 年 月 日 下午 温度 湿度 一、实验目的学习如何利用管道机制或消息缓冲队列进行进程间的通信,并加深对上述通信机制的理解。提高学生分析问题和解决问题的能力,并学习撰写规范的科学研究报告。二、实验环境及设备(一)实验室名称:计算机实验室(二)主要仪器设备:PC 机、Linux 操作系统环境3、实验内容编写一段程序,使
2、用管道来实现父子进程之间的进程通信。子进程项父进程发送自己的进程表示符,以及某字符串。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。4、实验调试分析1、实验函数说明(1)pipe头文件 :#include定义函数: int pipe(int pipedes2);函数说明:pipe()会建立管道,并将文件描述词由参数 pipedes 数组返回。pipedes0为管道里的读取端,所以 pipe 用 read 调用的pipedes1则为管道的写入端。进程 A pipedes1pipedes0 进程 B写读暨南大学本科实验报告专用纸(附页)2返回值: 若成功则返回零,否则返回 -
3、1,错误原因存于 errno 中。错误代码:EMFILE 进程已用完文件描述词最大量ENFILE 系统已无文件描述词可用。EFAULT 参数 pipedes 数组地址不合法。(2)sprintf函数功能:把格式化的数据写入某个字符串 头文件:#include 函数原型:int sprintf( char *buffer, const char *format , argument ); 返回值:字符串长度(strlen)(3)flock头文件: #include定义函数: int flock(int fd,int operation);函数说明: flock()会依参数operation所指定
4、的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。参数 operation有下列四种情况:LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。LOCK_UN 解除文件锁定状态。LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。2、
5、实 验 调 试实 验 过 程 中 , 由 于 将 字 符 串 is sending a message to parent!以 字 符 数组 的 形 式 存 储 的 , 故 只 申 请 了 31个 字 符 空 间 , 没 有 多 申 请 一 个 字 符 空 间 存 储末 尾 的 0, 在 程 序 运 行 时 就 会 出 现 错 误 结 果 , 错 误 结 果 如 下 图 所 示 , 理 论上 应 该 不 会 出 现 错 误 的 , 因 为 在 write、 read 函 数 中 都 有 限 制 向 管 道 中 写入 、 读 出 多 少 个 字 符 的 。 但 在 运 行 时 却 出 乎 意 料
6、 的 出 错 了 , 要 是 申 请 的 空 间大 于 字 符 个 数 , 就 不 会 出 现 错 误 了 。 在 实 验 过 程 中 还 遇 到 了 另 一 个 问 题 字 符 串 is sending a message to parent!被 两 次 输 出 。 怀 疑 是 该 字 符串 被 两 次 的 写 入 了 管 道 , 因 为 查 看 程 序 时 只 发 现 一 个 地 方 有 输 出 该 字 符 串 ,该 字 符 串 是 从 管 道 读 出 的 且 只 输 出 一 次 , 该 字 符 串 在 写 入 管 道 时 也 是 只 写 了一 次 。 总 之 向 管 道 中 写 入 一
7、次 字 符 串 , 也 读 出 一 次 , 但 是 输 入 该 字 符 串 时 且输 出 了 两 次 连 续 的 该 字 符 串 , 由 于 实 验 过 程 中 一 直 调 试 该 错 误 程 序 , 没 有 保留 当 时 的 程 序 , 所 以 没 有 找 到 当 时 错 误 的 原 因 。暨南大学本科实验报告专用纸(附页)35、实验结果六、实验源程序#include #include #include int main(int argc,char *argv)pid_t pid;int temp,result;暨南大学本科实验报告专用纸(附页)4int pipedes2;char s50;
8、char d50;if(pipe(pipedes)=-1) /*创建管道*/perror(pipe);exit(EXIT_FAILURE);if(pid=fork()=-1) /*创建新进程*/perror(fork);exit(EXIT_FAILURE);else if(pid = 0) /*子进程*/sprintf(s,%d is sending a message to parent!,getpid();printf(now,write data to pipen);flock(pipedes1,1,0);if(write(pipedes1,s,50)=-1) /*将数据写入管道*/perror(write);exit(EXIT_SUCCESS);flock(pipedes1,0,0);else if(pid 0) /*父进程*/wait(0);printf(now,read data form pipen);if(read(pipedes0,d,50)=-1) /*从管道中读取数据*/perror(read);exit(EXIT_FAILURE);printf(the data from pipe is: %sn,d);return 0;七、实验心得通过调用管道了解了父子进程之间的进程通信,子进程项发出的消息,对父进程的影响,以及父进程对子进程所有的内容进行显示