两个文件描述符之间的桥接

std*_*all 10 c sockets linux file-descriptor

我有一个我正在做的套接字select(),等待其他进程写入.一旦写入,我读取数据,并将其写入另一个文件描述符.我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符?

这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程.

thu*_*ila 6

在linux上,splice()当方向是从socket到file时,使用可能更合适.使用splice()有点复杂,但你得到两个方向.另外,我认为sendfile最近在内部使用了splice .

SO上有很多问题已经讨论过splice()和sendfile()之间的区别.在网上搜索还会发现有关拼接工作原理(来源和目的地)的相互矛盾的陈述.了解它是否适​​合您的情况的最佳方法是测试它.

关于兼容的文件系统:哪些文件系统支持通过Linux的拼接进行拼接(2)?

那么关于不支持TCP套接字拼接的旧内核:Linux的splice(2)在从TCP套接字拼接时是否有效?

Splice解释说:http: //kerneltrap.org/node/6505

Splice来源:http: //lxr.linux.no/#linux+v3.8.2/fs/splice.c


Jor*_*eña 4

抱歉,如果我误解了你的情况,但你的意思是这样的吗sendfile

sendfile - 在文件描述符之间传输数据

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count" );
Run Code Online (Sandbox Code Playgroud)

sendfile() 在一个文件描述符和另一个文件描述符之间复制数据。由于此复制是在内核中完成的,因此 sendfile() 比 read(2) 和 write(2) 的组合更有效,后者需要在用户空间之间传输数据。

  • 链接手册页的片段:* in_fd 参数必须对应于支持 mmap(2) 类似操作的文件(即,它不能是套接字)。* (4认同)