Unix domain socket 还是叫烟斗的?

在看到一个名为 socket 的 unix 之后,我以为它们叫管道。我看了一下名牌烟斗,没有发现有什么不同。我看到它们的初始化方式不同,但这是我唯一注意到的。两者都使用 C 写/读函数,工作方式类似于 AFAIK。

Unix 域套接字和命名管道之间的区别是什么?我什么时候才能挑一个呢?默认情况下我应该使用哪个(比如我在 C + + 中默认使用向量,而不是在有需要时使用 deque、 list 或者其他什么) ?

43829 次浏览

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

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


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

UNIX 域套接字通常比命名管道更灵活:

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

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