Unix 域套接字 VS 命名管道?

问题描述 投票:0回答:2

查看Unix命名套接字后,我认为它们是命名管道。我查看了名称管道,并没有发现太大的差异。我看到它们的初始化方式不同,但这是我注意到的唯一一件事。两者都使用 C 写/读函数并且工作方式相似。

  • Unix域套接字Named有什么区别 管道
  • 我什么时候会选择其中一个而不是另一个?
  • 我应该默认使用哪个(就像我在 C++ 中默认使用
    vector
    而不是使用
    deque
    list
    或其他任何我需要的东西一样)?
c linux named-pipes unix-socket
2个回答
158
投票

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

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

要使用其中许多功能,您需要使用

send()
/
recv()
系列系统调用,而不是
write()
/
read()


99
投票

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

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

命名管道实际上是双向的,但是
半双工

。这意味着通信可以从 A 端到 B 端,或者从 B 端到 A,但绝不能同时进行。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.