在看到一个名为 socket 的 unix 之后,我以为它们叫管道。我看了一下名牌烟斗,没有发现有什么不同。我看到它们的初始化方式不同,但这是我唯一注意到的。两者都使用 C 写/读函数,工作方式类似于 AFAIK。
Unix 域套接字和命名管道之间的区别是什么?我什么时候才能挑一个呢?默认情况下我应该使用哪个(比如我在 C + + 中默认使用向量,而不是在有需要时使用 deque、 list 或者其他什么) ?
一个区别是命名管道是单向的,因此需要使用其中两个管道来进行双向通信。插座当然是双向的。使用两个变量而不是一个(即两个管道而不是一个套接字)似乎稍微复杂一些。
此外,维基百科上的文章在 以下一点上也非常清楚: “ Unix 域套接字可以作为字节流或数据报序列创建,而管道只是字节流。”
实际上,命名管道是双向的,但是是 半双工。这意味着通信可以从 A 端到 B 端,或者从 B 端到 A 端,但绝不能同时进行。
UNIX 域套接字通常比命名管道更灵活:
要使用其中的许多特性,您需要使用 send()/recv()系列的系统调用,而不是 write()/read()。
send()
recv()
write()
read()