Voici une autre question à propos de splice(). J'espère l'employer pour copier des dossiers, et essaye d'employer deux appels d'épissure joints par un tuyau comme l'exemple sur la page de Wikipedia de épissure. J'ai écrit un exemple simple de test qui essaie de ne lire que les premiers 32K octets d'un fichier et de les écrire à un autre:Comment utiliser la fonction splice() de Linux pour copier un fichier dans un autre fichier?
#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;
}
Quand je lance cela, le fichier d'entrée semble être lu correctement, mais le second appel d'épissure échoue avec EINVAL. Quelqu'un sait ce que je fais mal ici?
Merci!
Pour quiconque lisant ceci, le deuxième appel 'splice' devrait seulement essayer de lire le nombre d'octets du tuyau comme le premier appel' splice' renvoyé. Sur les Linux de nos jours, la taille du tube par défaut est '65535'. – Jite