Jus*_*tin 44 pipe ipc socket linux-kernel fifo
我听说 FIFO 是命名管道。它们具有完全相同的语义。另一方面,我认为 Unix 域套接字与管道非常相似(尽管我从未使用过它)。所以我想知道它们是否都指的是 Linux 内核中的相同实现。任何的想法?
lge*_*get 45
UNIX 域套接字和 FIFO 可能共享其实现的某些部分,但它们在概念上非常不同。FIFO 在非常低的级别运行。一个进程将字节写入管道,另一个进程从中读取。UNIX 域套接字与 TCP/IP 套接字具有相同的行为。
套接字是双向的,可以被多个进程同时使用。一个进程可以在同一个套接字上接受多个连接并同时访问多个客户端。内核每次都会传递一个新的文件描述符,connect(2)或者accept(2)在套接字上被调用。数据包将始终进入正确的过程。
在 FIFO 上,这是不可能的。对于双向通信,您需要两个 FIFO,并且您的每个客户端都需要一对 FIFO。没有以选择性的方式书写或阅读的方式,因为它们是一种更原始的交流方式。
匿名管道和 FIFO 非常相似。不同之处在于匿名管道不作为文件系统上的文件存在,因此没有进程可以open(2)。它们由通过另一种方法共享它们的进程使用。如果一个进程打开一个 FIFO 然后执行,例如 a fork(2),它的子进程将继承它的文件描述符,其中包括管道。
UNIX 域套接字、匿名管道和 FIFO 的相似之处在于它们使用共享内存段。实现的细节可能因一个系统而异,但想法总是相同的:将相同部分的内存附加到两个不同的进程内存映射中,让它们共享数据
(编辑:这是实现它的一种明显方法,但那是不是它在 Linux 中实际是如何完成的,它只是将内核内存用于缓冲区,请参阅下面@tjb63 的回答)。
然后内核处理系统调用并抽象该机制。
小智 11
这里有一个很好的讨论:http : //www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos
就我所见,从演示幻灯片和来源@ http://lxr.free-electrons.com/source/fs/pipe.c - fifo 是作为管道的包装器实现的,管道本身是通过 pipefs 虚拟文件系统实现。
@lgeorget - 管道似乎使用内核内存作为读取器和写入器之间的缓冲区 - 它们不使用“共享内存”,而是在用户和内核地址空间之间复制内存(例如,pipe_read调用pipe_iov_copy_to_user,调用__copy_to_user_inatomic(或copy_to_user) . __copy_to_user_inatomiccall copy_user_generic,这是几个 ASM 实现中的一个。
| 归档时间: |
|
| 查看次数: |
34057 次 |
| 最近记录: |