2 个管道比 1 个插座对贵吗?

2 个管道比 1 个插座对贵吗?

假设我想启动一个协进程并将其标准输入和输出附加到主进程,我们有两个选项:

  1. 调用pipe(2)并创建2个管道,并将它们分别附加到协进程的标准输入和输出。

  2. 调用socketpair(2)并将套接字的 1 端附加到协进程的标准输入和输出。

众所周知,简单的管道可以比“套接字对”更有效地实现,这就是当今许多系统正在做的事情。但如果我们需要它双向工作怎么办? “管道对”仍然比套接字对更有效吗?

语境

我想尽我最大的努力编写符合标准的代码,因此目标平台被假定为“POSIX-in-general”。我的意思是,这个问题要求对部署在主要实现上的两种类型的 IPC 的一般实现技术进行比较,包括 Linux、{Free,Net,Open}BSD、一些 SVR4后代,例如 Solaris 11.4 等

另外,我所说的昂贵不仅仅是指 IO 吞吐量——系统资源消耗也是我关心的问题。

答案1

如果需要可移植性,则必须创建至少 2 个管道。这对应于 2 个打开的文件描述,而套接字的情况则对应 1 个打开的文件描述。

尽管不是性能/效率的原因,但您不能MSG_PEEK与管道一起使用,但可以将其与匿名套接字一起使用,例如使用socketpair(2).

相关内容