我不仅想知道用户方面的差异,还想知道Linux内核实现中的差异/常见部分。
答案 0 :(得分:21)
管道是单向的,因此您需要两个管道进行双向通信,而套接字对是双向的。
管道总是以流为导向,而socketpairs可以是面向数据报的。
socketpairs是普通的AF_UNIX
套接字,这意味着可以通过它们传递SCM_RIGHTS
和SCM_CREDENTIALS
等辅助消息。
在内核中,管道在网络代码中的文件系统代码和套接字对中实现。
答案 1 :(得分:11)
在多线程程序中,需要使用套接字对的shutdown()
和SCM_RIGHTS
功能来实现与子进程的防范通信。
如果多个线程pipe()
和fork()
同时出现,可能会意外复制管道;在这种情况下,管道的写入端可能永远不会被关闭,EOF可能永远不会在读取端发生,从而导致死锁。即使对于那些仅使用fork()
进行子进程的程序(即所有fork()
s在子进程中都被execve()
迅速跟踪),并发fork()
个并发比赛的管道捕获设置FD_CLOEXEC
位,禁止使用接受pipe2()
的非便携式Linux O_CLOEXEC
系统调用。
以便携式方式解决此危险,对于fork()
而不调用execve()
的程序,也涉及socketpairs:
shutdown()
之前调用close()
以导致竞赛EOF条件,无论文件描述符是否重复。SCM_RIGHTS
消息。