管道分析和总结.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
管道 什么是有名管道? 有名管道是一个能在互不相关进程之间传送数据的特殊文件。一个或多个进程向内写入数据,在另一端由一个进程负责读出。有名管道是在文件系统中可见 的,也就是说 ls 可以直接看到。(有名管道又称 FIFO,也就是先入先出。) 有名管道可以将无关的进程联系起来,而无名的普通管道一般只能将父子进程联系起来——除非你很努力地去尝试——当然也能联系两个无关进程。有名管道是严格单向的,尽管在一些系统中无名管道是双向的。 我如何建立一个有名管道? 在 shell 下交互地建立一个有名管道,你可以用 mknod 或 mkfifo 命令。在有些系统中,mknod 产生的文件可能在/etc 目录下,也就是说,可能不在你的目录下出现,所以请查看你系统中的 man 手册。[译者注:在 Linux 下,可以看一下 fifo(4)]要在程序中建立一个有名管道: /* 明确设置 umask,因为你不知道谁会读写管道 */ umask(0); if (mkfifo(test_fifo, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) { perror(mkfifo); exit(1); } 也可以使用 mknod。[译者注:在 Linux 下不推荐使用 mknod,因为其中有许多臭虫在 NFS 下工作更要小心,能使用 mkfifo 就不要用 mknod,因为 mkfifo()是 POSIX.1 标准。] /* 明确设置 umask,因为你不知道谁会读写管道 */ umask(0); if (mknod(test_fifo, S_IFIFO | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, 0)) { perror(mknod); exit(1); } 我如何使用一个有名管道? 使用有名管道十分简单:你如同使用一个普通文件一样打开它,用 read() 和 write()进行操作。但对管道使用 open()时可能引起阻塞,下面一些常用规律 可以参考。 如果你同时用读写方式(O_RDWR)方式打开,则不会引起阻塞。 如果你用只读方式(O_RDONLY)方式打开,则 open()会阻塞一直到有写方打开管道,除非你指定了 O_NONBLOCK,来保证打开成功。 同样以写方式(O_WRONLY)打开也会阻塞到有读方打开管道,不同的是 如果 O_NONBLOCK 被指定 open()会以失败告终。 当对有名管道进行读写的时,注意点和操作普通管道和套接字时一样:当写 入方关闭连接时 read()返回 EOF,如果没有听众 write()会得到一个 SIGPIPE 的信号,对此信号进行屏蔽或忽略会引发一个 EPIPE 错误退出。 能否在 NFS 上使用有名管道? 不能,在 NFS 协议中没有相关功能。(你可能可以在一个 NFS 文件系统中用有名管道联系两个同在客户端的进程。) 能否让多个进程同时向有名管道内写入数据? 如果每次写入的数据少于 PIPE_BUF 的大小,那么就不会出现数据交叉的情况。但由于对写入的多少没有限制,而read()操作会读取尽可能多的数据,因 此你不能知道数据到底是谁写入的。 PIPE_BUF 的大小根据 POSIX 标准不能小于 512,一些系统里在limits.h 中被定义,[译者注:Linux 中不是,其值是 4096。]这可以通过 pathconf()或fpathconf()对单独管道进行咨询得到。 有名管道的应用 “我如何时间服务器和多个客户端的双向交流?” — 对多的形式经常出现 , 只要每次客户端向 服务器发出的指令小于 PIPE_BUF,它们就可以通过一个有名管道向服务器发送数据。客户端可以很容 易地知道服务器传发数据的管道名。 但问题在于,服务器不能用一个管道来和所有客户打交道。如果不止一个客 户在读一个管道,是无法确保每个客户都得到自己对应的回复。 一个办法就是每个客户在向服务器发送信息前都建立自己的读入管道,或让服务器在得到数据后建立管道。使用客户的进程号(pid)作为管道名是一种常用的 方法。客户可以先把自己的进程号告诉服务器,然后到那个以自己进程号命名的 管道中读取回复。

文档评论(0)

dqy118 + 关注
官方认证
内容提供者

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

认证主体上海海滋实业有限公司
IP属地湖北
统一社会信用代码/组织机构代码
91310115MA7DL1JF2N

1亿VIP精品文档

相关文档