Re: [PATCH 00/11] splice cleanups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;
}

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux