#define _GNU_SOURCE #include #include #include #include #define pexit(msg) { perror(msg); return 1; } int main(int argc, char *argv[]) { int in, out, pipefd[2], pid, r; ssize_t copied; in = open(argv[1], O_RDONLY); if (in < 0) pexit("open"); out = open(argv[2], O_WRONLY | O_CREAT, 0644); if (out < 0) pexit("open"); r = pipe(pipefd); if (r < 0) pexit("pipe"); pid = fork(); if (pid < 0) pexit("fork()"); if (!pid) { r = dup2(pipefd[0], 0); if (r < 0) pexit("dup"); r = dup2(out, 1); if (r < 0) pexit("dup"); execvp("cat", (char*[]){"cat"}); pexit("exec"); } do { copied = splice(in, NULL, pipefd[1], NULL, 1024 * 1024, 0); if (copied < 0) pexit("splice"); } while (copied); return 0; }