【问题标题】:unix domain socket VS named pipes?unix域套接字VS命名管道?
【发布时间】:2012-03-17 12:59:22
【问题描述】:

在查看了一个名为 socket 的 unix 之后,我认为它们是命名管道。我查看了名称管道,并没有看到太大的区别。我看到它们的初始化方式不同,但这是我唯一注意到的。两者都使用 C 写/读功能,工作方式与 AFAIK 相似。

unix 域套接字和命名管道有什么区别?我什么时候会选择一个而不是另一个?我应该默认使用哪个(比如我在 C++ 中默认使用向量而不是使用双端队列、列表或其他任何我需要的东西)?

【问题讨论】:

  • @GregHewgill:不幸的是,这个问题更多的是“什么是 IPC”,而不是我要问的区别:/。我确实在发布之前看到了,我应该链接并说它相关吗? (对我没有帮助)
  • @acid:是的,链接相关问题并解释您仍然有什么问题总是一个好主意。
  • 这篇文章总结的很好。揭秘 Unix 域套接字:thomasstover.com/uds.html
  • 链接失效:techdeviancy.com/uds.html

标签: c linux named-pipes unix-socket


【解决方案1】:

UNIX 域套接字通常比命名管道更灵活。它们的一些优点是:

  • 您可以将它们用于两个以上的进程通信(例如,一个可能有多个客户端进程连接的服务器进程);
  • 它们是双向的;
  • 它们支持在进程之间传递经过内核验证的 UID/GID 凭据;
  • 它们支持在进程之间传递文件描述符;
  • 它们支持数据包和序列数据包模式。

要使用其中许多功能,您需要使用send() / recv() 系列系统调用,而不是write() / read()

【讨论】:

  • 另一方面,也许应该说名称管道的优势在于它们可以通过普通的open(2)调用“连接”到,这使得它们更适合构建ad-通常只接受文件名参数的程序之间的 hoc 管道。
【解决方案2】:

一个区别是命名管道是单向的,因此您需要使用其中的两个才能进行双向通信。套接字当然是两种方式。使用两个变量而不是一个变量(即两个管道而不是一个套接字)似乎稍微复杂一些。

此外,the following point 上的维基百科文章非常清楚:“Unix 域套接字可以创建为字节流或数据报序列,而管道只是字节流。”


命名管道实际上是双向的,但half-duplex。这意味着通信可以从 A 端到 B 端,或从 B 端到 A,但不能同时进行。

【讨论】:

  • 嗯,有趣的 +1。您是否偶然知道字节流和数据报之间的区别?也许像你已经为这个问题所做的那样在一两个句子中举例?
  • @acidzombie:数据报模式管道或套接字维护边界,因此一个write 调用会产生一个read 调用。在流模式下,数据可以连接在一起形成一个长流,因此可以一次读取多个写入,反之亦然。 (Windows 有数据报管道,根据 jtoberon 的回答 Unix 没有)
  • @xaxxon:您是否完全阅读了我的评论?带括号的部分说明 Windows 有它们,即使 Unix 没有。如果您检查the CreateNamedPipe documentation,您将看到PIPE_TYPE_MESSAGE 标志。
  • @xaxxon:管道和 unix 域套接字都是本地的,因此接收方完全清空其队列是无损的。
  • 是的,不像 UDP,数据报Unix域套接字是保证,按顺序交付。
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 2010-11-17
  • 1970-01-01
  • 2020-10-29
  • 2021-07-17
  • 2014-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多