10

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

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

4

2 回答 2

6

在 linuxsplice()上,当方向是从套接字到文件时,使用可能更合适。使用splice()有点复杂,但你有两个方向。另外,我认为 sendfile这些天在内部使用 splice。

SO上有很多问题已经讨论了splice()和sendfile()之间的区别。搜索网络还揭示了关于拼接工作的(来源和目的地)的相互矛盾的陈述。了解它是否适​​合您的情况的最佳方法是对其进行测试。

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

关于不支持 TCP 套接字拼接的旧内核:Linux 的 splice(2) 在从 TCP 套接字拼接时工作吗?

拼接说明: http: //kerneltrap.org/node/6505

拼接源: http: //lxr.linux.no/#linux+v3.8.2/fs/splice.c

于 2013-03-12T09:19:49.800 回答
4

对不起,如果我误解了你的情况,但你的意思是什么sendfile

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

#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) 的组合更有效,后者需要在用户空间和用户空间之间传输数据。

于 2013-03-12T07:00:28.193 回答