Messages in this thread | | | From | Miklos Szeredi <> | Date | Wed, 14 Sep 2016 11:30:38 +0200 | Subject | Re: [PATCH 00/11] splice cleanups |
| |
On Wed, Sep 14, 2016 at 10:55 AM, Cedric Blancher <cedric.blancher@gmail.com> wrote: > Is there any shell which uses pipe splicing?
for i in /usr/bin/*; do if file $i | grep -q ELF; then if nm -D $i | grep -q splice; then echo $i; fi; fi; done
For me it does not yield anything by which you could easily try out splicing.
Attaching a simple cp-like program which uses splice if you want to try it out.
Thanks, Miklos #define _GNU_SOURCE
#include <err.h> #include <fcntl.h> #include <unistd.h>
int main(int argc, char *argv[]) { int to, from, res; int pip[2]; int siz = 65536;
if (argc != 3) err(1, "usage: %s from_file to_file", argv[0]);
from = open(argv[1], O_RDONLY); if (from == -1) err(1, "opening %s", argv[1]);
to = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if (to == -1) err(1, "opening %s", argv[2]);
res = pipe(pip); if (res == -1) err(1, "creating pipe");
while (1) { int num;
res = splice(from, NULL, pip[1], NULL, siz, 0); if (res == -1) err(1, "splicing from %s to pipe", argv[1]);
num = res; if (num == 0) break;
do { res = splice(pip[0], NULL, to, NULL, num, 0); if (res == -1) err(1, "splicing from pipe to %s", argv[2]);
if (res == 0) break;
num -= res; } while (num); }
res = close(to); if (res == -1) err(1, "closing %s", argv[2]);
res = close(from); if (res == -1) err(1, "closing %s", argv[1]);
return 0; }
| |