Quería probar el syscall de empalme. Tengo esta función - debe copiar el contenido de un archivo a otro:Argumento no válido al llamar a linux splice()
static void test_splice(int in, int out) {
int i = 0, rcvd = 0;
int filedes[2];
off_t off = 0;
if (pipe(filedes) < 0) {
perror("Kicha pipe");
exit(EXIT_FAILURE);
}
for (i = 0; i < NUMLOOPS; ++i) {
if ((rcvd = splice(in, NULL, filedes[1], NULL, BUFSIZE, SPLICE_F_MORE | SPLICE_F_MOVE)) < 0) {
perror("splice");
exit(EXIT_FAILURE);
}
if (splice(filedes[0], NULL, out, NULL, rcvd, SPLICE_F_MORE | SPLICE_F_MOVE) < 0) {
perror("splice");
exit(EXIT_FAILURE);
}
}
}
La segunda llamada a empalmar en la primera iteración devuelve EINVAL (argumento no válido a partir perror) cada vez que - lo que podría ser la razón?
¿Qué tipo de sistema (s) de archivos son sus archivos? – Duck
Ambos ext3, pero también intenté leer desde/dev/zero y escribir en/dev/null con el mismo error. –
Acabo de resolverlo - Abrí el archivo usando fopen con el modo "a +" - cuando cambié a "w" - funcionó. –