ecco un'altra domanda su splice(). Spero di usarlo per copiare i file, e sto cercando di usare due chiamate di giunzione unite da una pipe come nell'esempio sulla pagina Wikipedia di splice. Ho scritto un semplice banco di prova, che cerca solo di leggere i primi 32K byte da un file e scrivere ad un altra:Come posso usare la funzione splice() di Linux per copiare un file in un altro file?
#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;
}
Quando eseguo questo, il file di input sembra essere letto correttamente, ma la seconda chiamata giunzione fallisce con EINVAL. Qualcuno sa cosa sto facendo male qui?
Grazie!
Per chiunque stia leggendo questo, la seconda chiamata 'splice' dovrebbe provare a leggere il numero di byte dalla pipe come la prima chiamata' splice' restituita. Su Linux di oggi, la dimensione del pipe di default è '65535'. – Jite