我正在审查一组由UNIX管理员提出的面试问题。我找到了一个名为“命名管道”的主题。
我搜索了这个话题;在某种程度上,我已经能够理解它:- 命名管道|| 先进先出
但是我仍然感到我缺乏何时使用这种特殊类型管道的知识。是否有未命名管道无法正常工作的特殊情况?
我正在审查一组由UNIX管理员提出的面试问题。我找到了一个名为“命名管道”的主题。
我搜索了这个话题;在某种程度上,我已经能够理解它:- 命名管道|| 先进先出
但是我仍然感到我缺乏何时使用这种特殊类型管道的知识。是否有未命名管道无法正常工作的特殊情况?
Answers:
我可以想到的命名管道(fifo)具有四个三个优点:
它们是双向的,未命名的管道可能是单向的 *
*)认为标准壳的
|
管道是单向的,几发炮弹(ksh
,zsh
,和bash
)也提供协进程,允许双向通信。POSIX将管道视为半双工(即,每一侧只能读取或写入),pipe()
系统调用返回两个文件句柄,您可能需要将其中一个视为只读,而将另一个视为只写。某些(BSD)系统支持同时读写(POSIX禁止),而在另一些系统上则需要两个管道,每个方向一个。检查pipe()
,popen()
并可能popen2()
手册页。尽管在Linux 2.6上它是依赖的,但无方向性可能不取决于管道是否命名。
(已更新,感谢Stephane Chazelas的反馈)
因此,使用未命名管道无法立即完成的一项任务是常规的客户端/服务器应用程序。
最后(灾区)上面点一下单向管道是在Linux上,POSIX(参见相关popen()
)说,管道仅需读取或写入,对Linux的他们是单向的。有关特定于Linux的详细信息,请参见了解Linux内核(第三版,O'Reilly)(p787)。其他操作系统提供双向(未命名)管道。
例如,Nagios将fifo用作其命令文件。各种外部进程(CGI脚本,外部检查,NRPE等)将命令/更新写入此fifo,这些由持久Nagios进程进行处理。
命名管道具有与TCP连接不同的功能,但是存在重要区别。由于fifo具有持久的文件系统名称,即使没有读取器,您也可以对其进行写操作,因此,尽管在接收方未接收到数据的情况下,您也不会丢失数据,但是写操作将被阻塞(没有异步或非阻塞的I / O)。已启动(或正在重新启动)。
作为参考,另请参见Unix域套接字,以及该Stackoverflow问题的答案,该问题总结了主要的IPC方法,并且该方法讨论了popen()
未命名管道或匿名管道提供了不同进程之间一对一,单向进程间通信的方式,这些进程通过父子关系或作为提供管道的公共父级的子进程(例如外壳)而关联处理。因为进程是相关的,所以文件描述符与管道的关联可以是隐式的,并且不需要具有进程外部名称的对象。仅当使用未命名管道的进程维护该管道的打开文件描述符时,该管道才会存在。当进程退出并且OS关闭与该进程关联的所有文件描述符时,未命名管道将关闭。
命名管道实际上是FIFO。这些是由文件系统中的节点表示的持久对象。命名管道在一个或多个进程之间提供了多对多,双向通信,这些通信不一定相关,也不必同时存在。管道的文件名用作通信过程之间的地址或协定。如果只有一个进程写入命名管道,而另一个进程从命名管道读取,则命名管道的行为与两个相关进程之间的未命名管道相同。
因此,简短的答案是,您需要一个命名管道来在可能不同时存在的不相关进程之间进行通信。
/run
Linux桌面系统上查看,则可能会同时找到两者(分别称为fifos和unix套接字)。这是IPC的一种形式。