From d2a9533036eca3cac8c1ce4f30a3598ba7c22c45 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 4 Mar 2013 15:20:08 +0100 Subject: [PATCH] splice: more examples... --- splice/readwrite1.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ splice/readwrite2.c | 55 ++++++++++++++++++++++++++++++++++++++++ splice/vmsplice.c | 30 ++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 splice/readwrite1.c create mode 100644 splice/readwrite2.c create mode 100644 splice/vmsplice.c diff --git a/splice/readwrite1.c b/splice/readwrite1.c new file mode 100644 index 0000000..9910614 --- /dev/null +++ b/splice/readwrite1.c @@ -0,0 +1,61 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 index 0000000..618683f --- /dev/null +++ b/splice/readwrite2.c @@ -0,0 +1,55 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 index 0000000..aca7bee --- /dev/null +++ b/splice/vmsplice.c @@ -0,0 +1,30 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +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; +} -- 2.34.1