I’m trying to test the sendfile() system call under Linux 2.6.32 to zero-copy data between two regular files.
As far as I understand, it should work: ever since 2.6.22, sendfile() has been implemented using splice(), and both the input file and the output file can be either regular files or sockets.
The following is the content of 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;
}
And when I’m running the following commands:
$ gcc sendfile_test.c
$ ./a.out infile outfile
The output is
sendfile: Invalid argument
And when running
$ strace ./a.out infile outfile
The output contains
open("infile", O_RDONLY) = 3
open("outfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
sendfile(4, 3, NULL, 1) = -1 EINVAL (Invalid argument)
What am I doing wrong?
You forgot to check that
argcis equal to3, i.e. you are opening the output file by the nameargv[2]but only give your program one argument (and you are not checking for errors afteropen(2).)You can use
strace(1)to find out which system call fails.Edit:
This looks like older kernel to me. Same source (modulo error checking) works fine here under
2.6.33.4 #3 SMP. Also, any particular reason you are copying just one byte?Trace: