我找到了几个答案,但它们似乎与 Windows 机器特别相关。所以我的问题是管道和套接字之间有什么区别,以及何时/如何选择一个而不是另一个?
问问题
53588 次
2 回答
98
管道和套接字之间有什么区别,何时/如何选择一个而不是另一个?
管道和套接字都处理字节流,但它们以不同的方式处理......
- 管道仅存在于特定主机内,它们指的是虚拟文件之间的缓冲,或连接该主机内进程的输出/输入。管道内没有数据包的概念。
- 套接字使用 IPv4 或 IPv6 对通信进行分组;这种通信可以扩展到本地主机之外。请注意,套接字的不同端点可以共享相同的 IP 地址;但是,它们必须侦听不同的 TCP/UDP 端口才能这样做。
用法:
- 使用管道:
- 当您想在特定服务器中将数据作为文件读取/写入时。如果您使用的是 C,那么您将使用
read()
管道write()
。 - 当您想将一个进程的输出连接到另一个进程的输入时...请参阅popen()
- 当您想在特定服务器中将数据作为文件读取/写入时。如果您使用的是 C,那么您将使用
- 使用套接字在不同的 IPv4 / IPv6 端点之间发送数据。很多时候,这发生在不同的主机之间,但套接字可以在同一主机内使用
于 2013-09-02T09:30:24.227 回答
37
为了完成 Mike 给出的答案,重要的是要提到 UNIX 域套接字的存在,它在任何符合 POSIX 的操作系统上都可用。尽管在使用语义方面与“普通”互联网套接字非常相似,但它们纯粹是机器本地的(当然互联网套接字也可以在本地工作),因此几乎表现得像管道。几乎,因为 UNIX 管道根据定义是单向的:
管道和 FIFO(也称为命名管道)提供单向的进程间通信通道。管道有一个读端和一个写端。写入管道写入端的数据可以从管道的读取端读取。(摘自手册页 pipe(7))
UNIX 域套接字也有一个非常不寻常的特性,因为除了数据之外,它们还允许发送文件描述符:这样,非特权进程可以访问其描述符已通过套接字发送的任何文件。根据维基百科,这种技术被 ClamAV 防病毒扫描守护程序使用。
于 2017-08-01T07:43:24.067 回答