answer 实验六的认识.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六 实验名称: 管道通信 实验目的: 掌握管道的通信原理与过程 可以使用管道实现进程间通信 实验时间 6学时 预备知识: 概念 管道有两种类型:无名管道和有名管道。无名管道没有名字,也从来不在文件系统中出现,只是和内存中的一个索引节点相关联的两个文件描述符,该索引节点指向指向内存中的一个物理块。写进程向管道写入数据时,字节被复制到共享数据页面中,读进程从管道读出数据时,字节从共享页面中读出。无名管道是半双工的,数据只能在一个方向传送,而且只能在相关的、有共同祖先的的进程之间使用。 有(命)名管道(FIFO)可以为两个不相关的进程提供通信。它不是临时对象,是文件系统中的一个实体,可以用mknod和mkfifo创建。在写进程使用之前,必须让读进程先打开管道,任何读进程从中读取之前必须有写进程向其写入数据。FIFO有一个路径与之关联,故无亲缘关系的进程可以访问同一个FIFO。 无名管道工作原理 无名管道由单个进程创建,但很少在单个进程内使用。其典型用途是在一个父进程和子进程之间通信。首先由一个进程创建一个管道后调用fork派生一个自身的拷贝,如图1: 然后,父进程关闭该管道的读出端,子进程关闭同一管道的写入端,这样就在父子进程间提供了一个单项数据流,如图2。 当需要一个双向数据流时,必须建立两个管道,每个方向一个,实际步骤如下: 创建管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]) fork() 父进程关闭管道1的读出端fd1[0] 父进程关闭管道2的写入端fd2[1] 子进程关闭管道1的写入端fd1[1] 子进程关闭管道2的读出端fd2[0] 管道布局如图3: 管道读写分别使用read和write系统调用,其中读取字节数不应大于PIPE_BUF(limits.h中定义,主要是为了保证原子操作),因此通常定义缓冲区大小为PIPE_BUF。管道使用完后要关闭(close)。 基本命令 2.1 $command1 | command2 将command1的标准输出作为command2的标准输入。 mknod 创建块、字符或管道文件 mkfifo 创建一个命名管道(FIFO) 系统调用 4.1 pipe(建立管道) 表头文件 #includeunistd.h 定义函数 int pipe(int filedes[2]); 函数说明 pipe()会建立管道,并将文件描述词由参数filedes数组返回。filedes[0]为管道里的读取端,filedes[1]则为管道的写入端。 返回值 若成功则返回零,否则返回-1,错误原因存于errno中。 错误代码 EMFILE 进程已用完文件描述词最大量。 ENFILE 系统已无文件描述词可用。 EFAULT 参数filedes数组地址不合法。 4.2 mkfifo(建立具名管道) 表头文件 #includesys/types.h #includesys/stat.h 定义函数 int mkfifo(const char * pathname,mode_t mode); 函数说明 mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode~umask),因此umask值也会影响到FIFO文件的权限。mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开FIFO文件时,O_NONBLOCK旗标会有影响 1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。 2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。 返回值 若成功则返回0,否则返回-1,错误原因存于errno中。 错误代码 EACCESS 参数pathname所指定的目录路径无可执行的权限 EEXIST 参数pathname所指定的文件已存在。 ENAMETOOLONG 参数pathname的路径名称太长。 ENOENT 参数pathname包含的目录不存在 ENOSPC 文件系统的剩余空间不足 ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。 EROFS 参数pathname指定的文件存在于只读文件系统内。 4.3 open(打开文件) 表头文件 #includesys/types.h #includesys/stat.h #includefcntl.h 定义函数 int

文档评论(0)

xuefei111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档