aquí hay otra pregunta sobre empalme(). Espero usarlo para copiar archivos, y estoy tratando de usar dos llamadas de empalme unidas por un tubo como el ejemplo en la página de Wikipedia de empalme. Escribí un caso de prueba sencilla que sólo se trata de leer los primeros 32K bytes de un archivo y escribir a otro:¿Cómo puedo usar la función splice() de Linux para copiar un archivo a otro archivo?
#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;
}
Cuando ejecuto esto, el archivo de entrada parece ser leído correctamente, pero la segunda llamada de empalme falla con EINVAL. ¿Alguien sabe lo que estoy haciendo mal aquí?
Gracias!
Para cualquiera que lea esto, la segunda llamada 'empalme' solo debería intentar leer el número de bytes de la tubería cuando se devuelve la primera llamada' empalme'. En Linux de hoy, el tamaño de tubería predeterminado es '65535'. – Jite