socketpair和一对未命名的管道之间有什么区别吗?

时间:2009-10-17 19:22:16

标签: sockets linux-kernel pipe

我不仅想知道用户方面的差异,还想知道Linux内核实现中的差异/常见部分。

2 个答案:

答案 0 :(得分:21)

  • 管道是单向的,因此您需要两个管道进行双向通信,而套接字对是双向的。

  • 管道总是以流为导向,而socketpairs可以是面向数据报的。

  • socketpairs是普通的AF_UNIX套接字,这意味着可以通过它们传递SCM_RIGHTSSCM_CREDENTIALS等辅助消息。

在内核中,管道在网络代码中的文件系统代码和套接字对中实现。

答案 1 :(得分:11)

在多线程程序中,需要使用套接字对的shutdown()SCM_RIGHTS功能来实现与子进程的防范通信。

如果多个线程pipe()fork()同时出现,可能会意外复制管道;在这种情况下,管道的写入端可能永远不会被关闭,EOF可能永远不会在读取端发生,从而导致死锁。即使对于那些仅使用fork()进行子进程的程序(即所有fork() s在子进程中都被execve()迅速跟踪),并发fork()个并发比赛的管道捕获设置FD_CLOEXEC位,禁止使用接受pipe2()的非便携式Linux O_CLOEXEC系统调用。

以便携式方式解决此危险,对于fork()而不调用execve()的程序,也涉及socketpairs:

  • 对于出站通道(即,从主程序写入子进程):使用socketpair而不是管道,并在父shutdown()之前调用close()以导致竞赛EOF条件,无论文件描述符是否重复。
  • 对于入站通道(即从子进程读取),在子进程中创建一个管道(以便写入端在父进程中永远不可见,以便意外复制),并通过套接字对仅将读取结束发送给父进程SCM_RIGHTS消息。