std*_*all 10 c sockets linux file-descriptor
我有一个我正在做的套接字select()
,等待其他进程写入.一旦写入,我读取数据,并将其写入另一个文件描述符.我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符?
这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程.
在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
抱歉,如果我误解了你的情况,但你的意思是这样的吗sendfile
?
sendfile - 在文件描述符之间传输数据
Run Code Online (Sandbox Code Playgroud)#include <sys/sendfile.h> ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count" );
sendfile() 在一个文件描述符和另一个文件描述符之间复制数据。由于此复制是在内核中完成的,因此 sendfile() 比 read(2) 和 write(2) 的组合更有效,后者需要在用户空间之间传输数据。