146

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

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

4

2 回答 2

128

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

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

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

于 2012-02-28T04:10:45.873 回答
79

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

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


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

于 2012-02-28T02:23:42.283 回答