UNIX域套接字VS命名管道?


122

在查看了一个名为socket的Unix之后,我以为它们被命名为管道。我看着名字管道,并没有发现很大的不同。我看到它们的初始化方式有所不同,但这就是我唯一注意到的事情。两者都使用C写入/读取功能,并且类似于AFAIK。

UNIX域套接字和命名管道有什么区别?我什么时候可以选一个?我应该默认使用哪个(例如,我在C ++中默认使用vector而不是使用双端队列,列表或其他需要的东西)?

c  linux 

1
@GregHewgill:不幸的是,这个问题更多是“什么是IPC”,而不是我要问的区别:/。我确实看到过,在发布之前,我应该链接并说相关吗?(对我没有帮助)

1
@acid:是的,链接相关问题并解释您仍然遇到的问题始终是一个好主意。
Ben Voigt 2012年

3
这篇文章很好地总结了一下。揭开Unix域套接字的神秘面纱:thomasstover.com/uds.html
Cong Ma

Answers:


106

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

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

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


11
另一方面,也许应该说名称管道具有可以通过普通open(2)调用“连接到”的优点,这使它们更适合于在通常只使用文件名参数的程序之间构造临时管道。
Dolda2000 '16

66

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

同样,维基百科的文章在以下几点上很清楚:“ Unix域套接字可以创建为字节流或数据报序列,而管道仅是字节流。”


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


1
嗯有趣+1。您是否偶然知道字节流和数据报之间的区别?也许举例来说,就像您已经针对此问题所做的那样,在一两个情感中?

7
@acidzombie:数据报模式管道或套接字维护边界,因此一个write调用产生一个read调用。在流模式下,数据可以在一个长流中串联在一起,因此可以一次读取许多写入,反之亦然。(Windows拥有数据报管道,根据jtoberon的回答Unix没有)-Ben
Voigt

1
@BenVoigt好,数据报套接字数据包传递不可靠,因此写入不一定会生成读取调用。也许是本地套接字,但是您的评论还不清楚。因此,不管它有什么问题。
2013年

3
@xaxxon:管道和unix域套接字都是本地的,因此接收方完全清空其队列是无损的。
Ben Voigt 2013年

6
是的, UDP 不同,数据报Unix域套接字是保证按顺序传递。
jtchitty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.