我正在尝试测试sendfile()
Linux 2.6.32 下的系统调用,以在两个常规文件之间进行零复制数据。据我了解,它应该可以工作:从 2.6.22 开始,sendfile()
已经使用 实现splice()
了,输入文件和输出文件都可以是常规文件或套接字。
以下是 的内容sendfile_test.c
:
#include <sys/sendfile.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char **argv) {
int result;
int in_file;
int out_file;
in_file = open(argv[1], O_RDONLY);
out_file = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
result = sendfile(out_file, in_file, NULL, 1);
if (result == -1)
perror("sendfile");
close(in_file);
close(out_file);
return 0;
}
当我运行以下命令时:
$ gcc sendfile_test.c
$ ./a.out infile outfile
输出是
sendfile: Invalid argument
而且跑步的时候
$ strace ./a.out infile outfile
输出包含
open("infile", O_RDONLY) = 3
open("outfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
sendfile(4, 3, NULL, 1) = -1 EINVAL (Invalid argument)
我究竟做错了什么?