--- /dev/null
+
+#define _GNU_SOURCE /* See feature_test_macros(7) */
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+int main(void)
+{
+ int ffd;
+ int pfds[2];
+#define BUF_SIZE 4096*2
+ char buf [BUF_SIZE] = {0, };
+ char buf2 [BUF_SIZE] = {0, };
+ ssize_t sret;
+ int ret;
+ off_t ofs;
+
+ memset(buf, 0x1f, BUF_SIZE);
+
+ // O_DIRECT, O_DSYNC, O_SYNC, O_LARGEFILE, O_NOFOLLOW, O_TMPFILE
+ ffd = open("/tmp/splice1.dat",
+ O_RDWR | O_CREAT | O_DIRECT, // | O_TMPFILE,
+ S_IRUSR | S_IWUSR);
+ printf("open(O_TMPFILE) => ffd[%d]\n", ffd);
+
+ sret = pwrite(ffd, buf, BUF_SIZE, BUF_SIZE);
+ printf("pwrite(count=BUF_SIZE,ofs=BUF_SIZE) sret[%zd]\n", sret);
+
+ ret = pipe(pfds);
+ printf("pipe() => ret[%d]\n", ret);
+
+ ofs = 0;
+ sret = splice(ffd, &ofs, pfds[1], NULL, BUF_SIZE*2, SPLICE_F_MOVE);
+ printf("splice(count=BUF_SIZE*2,ofs=0) sret[%zd]\n", sret);
+
+ memset(buf, 0xf0, BUF_SIZE);
+
+ sret = pwrite(ffd, buf, BUF_SIZE, 0);
+ printf("pwrite(count=BUF_SIZE,ofs=0) sret[%zd]\n", sret);
+ sret = pwrite(ffd, buf, BUF_SIZE, BUF_SIZE);
+ printf("pwrite(count=BUF_SIZE,ofs=BUF_SIZE) sret[%zd]\n", sret);
+
+ sret = read(pfds[0], buf, BUF_SIZE);
+ printf("read(count=BUF_SIZE,ofs=0) sret[%zd]\n", sret);
+
+ memset(buf2, 0x00, BUF_SIZE);
+ ret = memcmp(buf, buf2, BUF_SIZE);
+ printf("memcmp() at ofs=0, expecting 0x00 => ret[%d]\n", ret);
+
+ sret = read(pfds[0], buf, BUF_SIZE);
+ printf("read(count=BUF_SIZE,ofs=BUF_SIZE) sret[%zd]\n", sret);
+
+ memset(buf2, 0x1f, BUF_SIZE);
+ ret = memcmp(buf, buf2, BUF_SIZE);
+ printf("memcmp() at ofs=BUF_SIZE, expecting 0x1f => ret[%d]\n", ret);
+ return 0;
+}