假设我想启动一个协进程并将其标准输入和输出附加到主进程,我们有两个选项:
调用
pipe(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)
.