unix域套接字VS命名管道?

112 c linux

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

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

caf*_*caf 97

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

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

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

  • 另一方面,或许应该说名称管道的优点是它们可以通过普通的`open(2)`调用"连接",这使它们更适合在程序之间构建临时管道.通常只接受文件名参数. (11认同)

jto*_*ron 63

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

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

  • @acidzombie:数据报模式管道或套接字维护边界,因此一个`write`调用产生一个`read`调用.在流模式下,数据可以在一个长流中连接在一起,因此可以一次读取许多写入,反之亦然.(Windows有数据报管道,根据jtoberon的回答Unix没有) (7认同)
  • 是的,*与*UDP不同,数据报Unix域套接字是*保证*,按顺序交付. (6认同)
  • 嗯有趣+1。您是否偶然知道字节流和数据报之间的区别?也许像你已经为这个问题所做的一两句话的例子? (2认同)
  • @xaxxon:您完全阅读了我的评论吗?括号内的部分解释了即使 Unix 没有,Windows 也有它们。如果您检查“CreateNamedPipe”文档](http://msdn.microsoft.com/en-us/library/aa365150),您将看到“PIPE_TYPE_MESSAGE”标志。 (2认同)
  • @xaxxon:管道和unix域套接字*都是*local,所以无损是接收器完全清空它的队列. (2认同)