操作系统实验三(进程通信)

操作系统实验三(进程通信)

ID:38628606

大小:1.43 MB

页数:4页

时间:2019-06-16

操作系统实验三(进程通信)_第1页
操作系统实验三(进程通信)_第2页
操作系统实验三(进程通信)_第3页
操作系统实验三(进程通信)_第4页
资源描述:

《操作系统实验三(进程通信)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、暨南大学本科实验报告专用纸(附页)暨南大学本科实验报告专用纸课程名称《操作系统原理实验》成绩评定实验项目名称进程通信指导教师戴红实验项目编号0806002903实验项目类型综合型实验地点学生姓名蔡高成学号2007052431学院国际商学院系企业管理专业信息管理与信息系统实验时间年月日下午温度℃湿度一、实验目的学习如何利用管道机制或消息缓冲队列进行进程间的通信,并加深对上述通信机制的理解。提高学生分析问题和解决问题的能力,并学习撰写规范的科学研究报告。二、实验环境及设备(一)实验室名称:计算机实验室(二)主要仪器设备:PC机、Linux操作系统环境三、实

2、验内容编写一段程序,使用管道来实现父子进程之间的进程通信。子进程项父进程发送自己的进程表示符,以及某字符串。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。四、实验调试分析1、实验函数说明进程Apipedes[1]pipedes[0]进程B写读(1)pipe头文件:#include定义函数:intpipe(intpipedes[2]);函数说明:pipe()会建立管道,并将文件描述词由参数pipedes数组返回。pipedes[0]为管道里的读取端,所以pipe用read调用的pipedes[1]则为管道的写入端

3、。4暨南大学本科实验报告专用纸(附页)返回值:若成功则返回零,否则返回-1,错误原因存于errno中。错误代码:EMFILE进程已用完文件描述词最大量ENFILE系统已无文件描述词可用。EFAULT参数pipedes数组地址不合法。(2)sprintf函数功能:把格式化的数据写入某个字符串  头文件:#include函数原型:intsprintf(char*buffer,constchar*format[,argument]…); 返回值:字符串长度(strlen)(3)flock头文件:#include定义函

4、数:intflock(intfd,intoperation);函数说明:flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。参数operation有下列四种情况:LOCK_SH建立共享锁定。多个进程可同时对同一个文件作共享锁定。LOCK_EX建立互斥锁定。一个文件同时只有一个互斥锁定。LOCK_UN解除文件锁定状态。LOCK_NB无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX做OR(

5、)组合。单一文件无法同时建立共享锁定

6、和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。返回值返回0表示成功,若有错误则返回-1,错误代码存于errno。2、实验调试实验过程中,由于将字符串"issendingamessagetoparent!"以字符数组的形式存储的,故只申请了31个字符空间,没有多申请一个字符空间存储末尾的'',在程序运行时就会出现错误结果,错误结果如下图所示,理论上应该不会出现错误的,因为在write、read函数中都有限制向管道中写入、读出多少个字符的。但在运行时却出乎意料的出错了,要是申请的空间大于字符个数,就不会出现错误了。在实验过程

7、中还遇到了另一个问题——字符串"issendingamessagetoparent!"被两次输出。怀疑是该字符串被两次的写入了管道,因为查看程序时只发现一个地方有输出该字符串,该字符串是从管道读出的且只输出一次,该字符串在写入管道时也是只写了一次。总之向管道中写入一次字符串,也读出一次,但是输入该字符串时且输出了两次连续的该字符串,由于实验过程中一直调试该错误程序,没有保留当时的程序,所以没有找到当时错误的原因。4暨南大学本科实验报告专用纸(附页)五、实验结果六、实验源程序#include#include#incl

8、udeintmain(intargc,char*argv[]){pid_tpid;inttemp,result;intpipedes[2];4暨南大学本科实验报告专用纸(附页)chars[50];chard[50];if((pipe(pipedes))==-1)/*创建管道*/{perror("pipe");exit(EXIT_FAILURE);}if((pid=fork())==-1)/*创建新进程*/{perror("fork");exit(EXIT_FAILURE);}elseif(pid==0)/*子进程*/{sprintf

9、(s,"%dissendingamessagetoparent!",getpid());pri

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。