2 Nouvelle implantation de la commande cp
Il s'agit de définir une nouvelle implantation, plus efficace, de la
commande cp de copie de fichier. On se limite à la copie
d'un fichier source unique dans un fichier destination.
La version 2.4 du noyau Linux introduit, comme d'autres systèmes, un
appel système non standard sendfile() pour réaliser
efficacement la copie d'un fichier. Le prototype de cet appel
système est le suivant :
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
Cet appel système copie des données entre un descripteur de fichier et
un autre. Le descripteur in_fd doit être ouvert en lecture,
et out_fd en écriture. Le pointeur offset doit
correspondre à une variable contenant la position dans le fichier
d'entrée à partir de laquelle sendfile() commencera la
lecture. Lorsque la routine se termine, cette variable pointée par
offset est remplie avec la position de l'octet
immédiatement après le dernier octet lu. L'argument count
est le nombre d'octets à copier entre les descripteurs de fichiers. La
fonction retourne le nombre d'octets écrits, -1 en cas d'erreur.
Exercice 5
Donnez le principe et le code C d'une implantation d'une fonction
copy_file() Ã l'aide de sendfile() ; la fonction
int copy_file(const char *src, const char *dst);
copiant d'un fichier source de nom src dans un fichier
destination de nom dst.
L'introduction de l'appel système sendfile() a été motivée
par une double considération :
-
limiter le coût de transferts mémoire lors de la réalisation
de copies de fichiers ;
- limiter le nombre de changements de mode du processeur lors de
la réalisation de copies de fichiers.
Exercice 6
Pour chacun des deux points : transfert mémoire, et changement de
mode du processeur, explicitez en quoi l'introduction de l'appel
système sendfile() rend plus efficace la réalisation de
copie de fichiers.