实验八 进程通信应用_第1页
实验八 进程通信应用_第2页
实验八 进程通信应用_第3页
实验八 进程通信应用_第4页
实验八 进程通信应用_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.;实验八 进程通信应用实验目的1. 掌握命名管道的原理和应用2. 掌握文件映射共享内存的原理3、掌握基于进程通信的程序设计方法实验内容1 (1)命令行下创建有名管道myfifo,ls l查看,分别在两个终端运行cat myfifo分析执行情况,将cat在后台运行,echo在前台运行,执行情况如何?分析FIFO的打开规则。(2) 设计两个程序,要求用命名管道FIFO,实现文本文件复制功能,即实现copy file1 file2的功能,file1是已经存在的文件,file2可以不存在,如果存在就清空原来的内容,通过建立的有名管道实现file1的内容复制到file2。一、 FIFO1.有名管道的创

2、建#include #include int mkfifo(const char * pathname, mode_t mode)该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。第二个参数与打开普通文件的open()函数中的mode 参数相同。2. 有名管道的打开有名管道创建成功后并没有打开,需要使用系统调用open( )将对应的文件打开。 open(const char*pathname,oflg)其中,参数pathname是要打开的有名管道的路径名,oflg是文件打开时的存取方式。必须指定的互斥模式:O_RDONLY, O_WRONLY, O_NONBLOCKO_RDON

3、LY:若无进程写方式打开FIFO,open阻塞O_RDONLY |O_NONBLOCK:若无进程写方式打开FIFO,open立即返回O_WRONLY:若无进程读方式打开FIFO,open阻塞O_WRONLY| O_NONBLOCK:若无进程读方式打开FIFO,open返回ENXIO错误,-1FIFO的打开规则:(1)如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。(2)如果当前打开操作是为写而打开FIFO时,如果

4、已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。3.有名管道的读写#include ssize_t read(int fd, void *buf, size_t count);返回值: 读到的字节数,若已到文件尾为0,若出错为-1ssize_t write(int fd, const void *buf, size_t count);返回值: 若成功为已写的字节数,若出错为-1 从FIFO中读取数据readl 以阻塞方式打开的FIFO,read

5、调用: 当前FIFO内没有数据,read调用将一直阻塞。 当前FIFO内有数据,但有其它进程在读这些数据 解除阻塞的原因则是FIFO中有新的数据写入,不论信写入数据量的大小,也不论读操作请求多少数据量。 l 以非阻塞方式打开的FIFO,read调用: 当前FIFO内没有数据,立即返回-1,当前errno值为EAGAIN,提醒以后再试。 向FIFO中写入数据writel 对于设置了阻塞标志的写操作:当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到当缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作。 当

6、要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。FIFO缓冲区一有空闲区域,写进程就会试图向管道写入数据,写操作在写完所有请求写的数据后返回。 l 对于没有设置阻塞标志的写操作:当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果当前FIFO空闲缓冲区能够容纳请求写入的字节数,写完后成功返回;如果当前FIFO空闲缓冲区不能够容纳请求写入的字节数,则返回EAGAIN错误,提醒以后再写;当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。在写满所有FIFO空闲缓冲区后,写操作返回。 4.有名管道删除有名管道和普通文件一样,存在于

7、磁盘中。但是有名管道不能直接存储文件,其存储的通讯信息在通信的两个进程结束后自动丢失。与无名管道不同,通信的两个进程结束后,有名管道文件依然存在。需要使用系统调用unlink( )删除有名管道文件。头文件: #include 系统调用格式: int unlink(const char *pathname);unlink( )会删除参数pathname指定的文件。二、 mmapLinux提供了内存映射函数mmap, 它把文件内容映射到一段内存上, 通过对这段内存的读取和修改, 实现对文件的读取和修改。头文件: void *mmap(void *addr, size_t length, int p

8、rot, int flags, int fd, off_t offsize);返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).参数:addr: 指定映射的起始地址, 通常设为NULL, 由系统指定.length: 将文件的多大长度映射到内存.prot: 映射区的保护方式, 可以是:PROT_EXEC: 映射区可被执行.PROT_READ: 映射区可被读取.PROT_WRITE: 映射区可被写入.PROT_NONE: 映射区不能存取.flags: 映射区的特性, 可以是:MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.MAP_ANONYMOUS:采取匿名映射。fd: 由open返回的文件描述符, 代表要映射的文件,匿名映射时指定为-1。offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.内存映射的步骤:用open系统调用打开文件, 并返回描述符fd.用mmap建立内存映射, 并返回映射首地址指针start.对映射(文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论