20

我不仅想知道用户端的差异,还想知道 Linux 内核实现中的差异/共同部分。

4

2 回答 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 回答