操作系统-管道通信课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机操作系统》课程设计报告

课程名称:操作系统

设计题目:管道通信

指导教师:*******

班级:*******

学号:*****

学生姓名:***

同组人员:*******************

计算机科学与工程学院

2014年6月19 日

前言:

Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。

这就要求大家:

(1)熟悉Linux的操作和开发环境;

(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。

我们的设计和实验将在Windows xp环境下,基于虚拟机软件VMWare软件进行安装。

学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。

管道通信,通过在两个进程间创建通道,一个写信息通过通道传送给另一个进程并且读出来,同过实践让我们了解了什么是管道通信机制,实现了程序进程间的通信。积极通过合作,完成任务。

目录

第一章:系统环境 (4)

1.1硬件环境 (4)

1.2软件环境 (4)

第二章:设计目的 (4)

第三章:总体设计 (5)

3.1程序设计组成框图 (5)

3.2流程图 (6)

3.2.1匿名管道通信C/S流程图 (6)

3.2.2命名管道通信C/S流程图 (6)

第四章:详细设计 (8)

4.1匿名管道通信 (8)

4.2命名管道通信 (10)

第五章:调试与测试 (13)

第六章:设计中遇到的问题及解决方法 (15)

第七章:源程序清单和执行结果及分析 (16)

第八章 :总结 (20)

第九章 :参考文献 (20)

第一章:系统环境

1.1硬件环境

Intel(R)Core™******************** 2.00GB内存

1.2软件环境

1)Microsoft Windows XP Professional 版本2002 Service Pack 3

2)Vmware Workstation 10.0.1 build-1379776

3)Red Hat Linux 9

第二章:设计目的

实践操作系统原理知识,根据题目要求设计、实现进程的管道通信,并且在虚拟机中模拟的linux系统中运行检测。

第三章:总体设计

3.1程序设计组成框图

无名管道读写示意图

命名管道操作示意图

3.2流程图

3.2.1匿名管道通信C/S流程图3.2.2命名管道通信C/S流程图

FIFO写进程:

第四章:详细设计

4.1匿名管道通信

管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程创建的管道。注意事项:必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符。否则,会创建两个管道,因为父子进程共享同一段代码段,都会各自调用pipe(),即建立两个管道,出现异常错误。父进程通过管道向服务器发布命令,然后由服务器执行命令。

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 可重定义为:

int read(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来移动。

#include

#include

#include

#include

#include

#include

/*

* 程序入口

* */

int main()

{

int pipe_fd[2];

pid_t pid;

char buf_r[100];

char* p_wbuf;

int r_num;

memset(buf_r,0,sizeof(buf_r)); //对较大的结构体或数组进行清零操作的一种最快方法

/*创建管道*/

if(pipe(pipe_fd)<0)

{

printf("pipe create error\n");

return -1;

}

/*创建子进程*/

if((pid=fork())==0) //子进程执行序列

{

printf("\n");

close(pipe_fd[1]);//子进程先关闭了管道的写端

sleep(2); /*让父进程先运行,这样父进程先写子进程才有内容读*/

if((r_num=read(pipe_fd[0],buf_r,100))>0)

{

printf("%d numbers read from the pipe is %s\n",r_num,buf_r);

相关文档
最新文档