我不仅想知道用户端的差异,还想知道 Linux 内核实现中的差异/共同部分。
问问题
9062 次
2 回答
27
管道是单向的,因此您需要两个管道进行双向通信,而套接字对是双向的。
管道总是面向流的,而套接字对可以是面向数据报的。
socketpairs 是普通的
AF_UNIX
套接字,这意味着辅助消息喜欢SCM_RIGHTS
并且SCM_CREDENTIALS
可以通过它们传递。
在内核中,管道在文件系统代码中实现,套接字对在网络代码中实现。
于 2009-10-19T21:44:46.507 回答
16
在多线程程序中实现与子进程的防竞争通信需要套接字对的shutdown()
和功能。SCM_RIGHTS
pipe()
多线程的情况下,管道可能会意外复制fork()
;在这种情况下,管道的写入端可能永远不会关闭,而读取端可能永远不会发生 EOF,从而导致死锁。即使对于那些fork()
仅用于子进程的程序(即所有fork()
s 都在子进程中立即跟随execve()
),并发的管道捕获fork()
仍然与设置FD_CLOEXEC
位竞争,除非使用pipe2()
接受O_CLOEXEC
.
以一种可移植的方式解决这个危险,也适用于fork()
没有调用的程序execve()
,涉及套接字对:
- 对于出站通道(即,从主程序写入子进程):使用套接字对而不是管道并在父进程
shutdown()
之前调用close()
以导致竞争证明 EOF 条件,无论文件描述符是否重复。 - 对于入站通道(即从子进程读取),在子进程中创建一个管道(以便在父进程中永远不会看到写入端以防意外复制),并通过带有
SCM_RIGHTS
消息的套接字对仅将读取端发送到父进程。
于 2012-04-25T13:10:10.480 回答