我知道通过拼接,我们都可以留在内核中。但我不确定传递给管道的是数据还是行踪信息。
编辑1: 谢谢@vinayak,现在我知道实际上有数据复制到管道缓冲区和从管道缓冲区复制。但是,我只是想知道为什么我们不能只将行踪和长度信息传递给管道?
- 在单个进程内,地址空间是相同的
- 在不同的进程之间,如果管道缓冲区是线性映射的,它也可以工作。如果没有,我们可以使用 DMA 地址。
我知道通过拼接,我们都可以留在内核中。但我不确定传递给管道的是数据还是行踪信息。
编辑1: 谢谢@vinayak,现在我知道实际上有数据复制到管道缓冲区和从管道缓冲区复制。但是,我只是想知道为什么我们不能只将行踪和长度信息传递给管道?
splice() 是一种系统调用机制,用于在内核空间中从一个文件到另一个文件进行 i/o,而无需从/到用户空间进行复制。它是一种提高 I/O 性能的方法。splice 系统调用避免了从用户空间到内核空间的所有数据复制,反之亦然。它从输入文件的指定偏移量读取并写入内核空间中的管道。没有将数据复制到用户空间。然后可以调用它以将数据从管道写入指定/当前偏移量的输出文件。
splice() 的工作原理是使用管道缓冲区机制为数据源打开一个文件描述符,为数据接收器打开另一个文件描述符,然后使用 splice() 可以将两者连接在一起。换句话说, splice() 在用户可以控制的内核缓冲区上工作,并将数据从缓冲区移入/移出任意文件描述符。像往常一样,用管道指定偏移量是一个错误。如果没有使用输入/输出文件描述符指定偏移量,则当前偏移量将被假定为指定的偏移量。当前文件描述符之一必须是管道,否则会出错。