splice: more examples...
authorStefan Metzmacher <metze@samba.org>
Mon, 4 Mar 2013 14:20:08 +0000 (15:20 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 4 Mar 2013 14:20:08 +0000 (15:20 +0100)
splice/readwrite1.c [new file with mode: 0644]
splice/readwrite2.c [new file with mode: 0644]
splice/vmsplice.c [new file with mode: 0644]

diff --git a/splice/readwrite1.c b/splice/readwrite1.c
new file mode 100644 (file)
index 0000000..9910614
--- /dev/null
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/uio.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <sys/sendfile.h>
+
+int main(int argc, const char * const *argv)
+{
+       ssize_t ret;
+       int pfd[2];
+       int rc;
+       void *ptr;
+       struct iovec iov[2];
+
+       static const uint8_t buf[0x2000];
+
+       int zfd = open("/dev/zero", O_RDWR);
+       loff_t zofs = 5;
+       size_t zlen = 0x20000;
+       int nfd = open("/dev/null", O_WRONLY);
+       loff_t nofs = 5;
+       size_t nlen = 0x200;
+       int i;
+       int sfd[2];
+       rc = socketpair(PF_UNIX, SOCK_STREAM, 0, sfd);
+
+       rc = pipe(pfd);
+
+#if 0
+       errno = 0;
+       ret = write(pfd[1], buf, sizeof(buf));
+       printf("%d: ret[%lld] errno[%d/%s]\n", __LINE__,
+               (long long int)ret, errno, strerror(errno));
+#endif
+
+for (i=0; i < 0x10000; i++) {
+       off_t ofs = 0;
+
+       errno = 0;
+       ret = sendfile(sfd[1], zfd, NULL/*&ofs*/, nlen);
+       if (ret < 0) {
+               printf("%d: ret[%lld] errno[%d/%s]\n", __LINE__,
+                       (long long int)ret, errno, strerror(errno));
+               break;
+       }
+}
+#if 0
+       errno = 0;
+       ret = splice(pfd[0], NULL, nfd, &nofs, nlen, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
+       printf("%d: ret[%lld] errno[%d/%s]\n", __LINE__,
+               (long long int)ret, errno, strerror(errno));
+#endif
+
+       return 0;
+}
diff --git a/splice/readwrite2.c b/splice/readwrite2.c
new file mode 100644 (file)
index 0000000..618683f
--- /dev/null
@@ -0,0 +1,55 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/uio.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <sys/sendfile.h>
+
+int main(int argc, const char * const *argv)
+{
+       int zfd = open("/dev/zero", O_RDONLY);
+       int nfd = open("/dev/null", O_WRONLY);
+       size_t total = 0;
+#define TOTAL 0xFFFFFFFFF
+#define BUFFER 0x100000
+       size_t i = 0;
+
+       while (total < TOTAL) {
+               uint8_t buf[BUFFER];
+               ssize_t zret;
+               ssize_t nret;
+
+               errno = 0;
+               zret = read(zfd, buf, sizeof(buf));
+               if (zret < 0) {
+                       printf("%d: zret[%lld] errno[%d/%s]\n", __LINE__,
+                               (long long int)zret, errno, strerror(errno));
+                       break;
+               }
+
+               errno = 0;
+               nret = write(nfd, buf, zret);
+               if (nret < 0) {
+                       printf("%d: nret[%lld] errno[%d/%s]\n", __LINE__,
+                               (long long int)nret, errno, strerror(errno));
+                       break;
+               }
+               if (nret != zret) {
+                       printf("%d: zret[%lld] nret[%lld]\n", __LINE__,
+                               (long long int)zret,
+                               (long long int)nret);
+                       break;
+               }
+
+               total += nret;
+               i++;
+       }
+
+       printf("i[%lld]\n", (long long int)i);
+       return 0;
+}
diff --git a/splice/vmsplice.c b/splice/vmsplice.c
new file mode 100644 (file)
index 0000000..aca7bee
--- /dev/null
@@ -0,0 +1,30 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/uio.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+int main(int argc, const char * const *argv)
+{
+       ssize_t ret;
+       int fd[2];
+       int rc;
+       void *ptr;
+       struct iovec iov[2];
+
+       iov[0].iov_len = 64*1024;
+       iov[0].iov_base = malloc(iov[0].iov_len);
+       iov[1].iov_len = 0xFF;
+       iov[1].iov_base = malloc(iov[1].iov_len);
+
+       rc = pipe(fd);
+
+       ret = vmsplice(fd[1], iov, 2, 0);
+       printf("%d: ret[%lld] errno[%d/%s]\n", __LINE__,
+               (long long int)ret, errno, strerror(errno));
+
+       return 0;
+}