Hier ist eine andere Frage über splice(). Ich hoffe, ich benutze es, um Dateien zu kopieren, und versuche, zwei Spleißanrufe zu verwenden, die durch eine Pipe verbunden sind, wie das Beispiel auf der Wikipedia-Seite von splice. Ich schrieb einen einfachen Testfall, der nur den ersten 32 K Bytes aus einer Datei zu lesen versucht und schreibt sie in einer anderen:Wie kann ich mit der Funktion splice() von Linux eine Datei in eine andere Datei kopieren?
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv) {
int pipefd[2];
int result;
FILE *in_file;
FILE *out_file;
result = pipe(pipefd);
in_file = fopen(argv[1], "rb");
out_file = fopen(argv[2], "wb");
result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
result = splice(pipefd[0], NULL, fileno(out_file), 0, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
if (result == -1)
printf("%d - %s\n", errno, strerror(errno));
close(pipefd[0]);
close(pipefd[1]);
fclose(in_file);
fclose(out_file);
return 0;
}
Als ich dies ausführen, scheint die Eingabedatei korrekt gelesen zu werden, aber den zweiten Splice-Aufruf schlägt mit EINVAL fehl. Weiß jemand, was ich hier falsch mache?
Danke!
Für jeden, der dies liest, sollte der zweite 'Spleiß'-Aufruf nur versuchen, die Anzahl der Bytes aus der Pipe zu lesen, wenn der erste 'Spleiß'-Aufruf zurückkommt. Auf heutigen Linux ist die Standard-Pipe-Größe '65535'. – Jite