Re: [PATCH 00/11] splice cleanups

From: Miklos Szeredi
Date: Wed Sep 14 2016 - 05:30:48 EST


On Wed, Sep 14, 2016 at 10:55 AM, Cedric Blancher
<cedric.blancher@xxxxxxxxx> 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;
}