10 #include <sys/socket.h>
11 #include <sys/sendfile.h>
13 int main(int argc, const char * const *argv)
20 size_t current_size = 0;
21 uint8_t *buffer = NULL;;
25 printf("%s: usage %s <'splice'|'rw'> <total_size> <buffer_size>\n",
30 total_size = strtoull(argv[2], NULL, 0);
31 buffer_size = strtoull(argv[3], NULL, 0);
33 if (strcmp(argv[1], "splice") == 0) {
35 fcntl(pfd[1], F_SETPIPE_SZ, 1048576);
37 buffer = malloc(buffer_size);
40 zfd = open("/dev/zero", O_RDONLY);
41 nfd = open("/dev/null", O_WRONLY);
43 while (current_size < total_size) {
49 zret = read(zfd, buffer, buffer_size);
51 zret = splice(zfd, NULL, pfd[1], NULL,
52 buffer_size, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
55 printf("%d: zret[%lld] errno[%d/%s]\n", __LINE__,
56 (long long int)zret, errno, strerror(errno));
62 nret = write(nfd, buffer, zret);
64 nret = splice(pfd[0], NULL, nfd, NULL,
65 zret, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
68 printf("%d: nret[%lld] errno[%d/%s]\n", __LINE__,
69 (long long int)nret, errno, strerror(errno));
73 printf("%d: zret[%lld] nret[%lld]\n", __LINE__,
83 printf("%s: i[%lld] total_size[%lld] buffer_size[%lld => %lld]\n",
86 (long long int)total_size,
87 (long long int)buffer_size,
88 (long long int)(total_size/i));