unix域套接字VS命名管道?

时间:2012-02-28 02:15:22

标签: c linux

在查看一个名为socket的unix后,我认为它们被命名为管道。我看着名字管道并没有看到太大的区别。我看到它们的初始化方式不同,但这是我唯一注意到的事情。两者都使用C写/读功能,并且类似于AFAIK。

unix域套接字和命名管道之间的区别是什么?我何时会选择一个而不是另一个?默认情况下我应该使用哪个(比如我在C ++中默认使用向量而不是使用deque,list或其他任何我需要的东西)?

2 个答案:

答案 0 :(得分:91)

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

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

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

答案 1 :(得分:60)

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

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