Information

Author(s) Olivier Martin, Cyril Pletinckx, Minh-Phuong Tran
Deadline Καμία προθεσμία
Submission limit No limitation

Συνδεθείτε

Q4 : File copy

Étant donné un fichier contenant des octets arbitraires, vous devez écrire une fonction qui copie le fichier. Évidemment, votre fonction ne peut pas modifier le contenu du fichier d'origine. Attention, le fichier copié doit avoir les mêmes permissions que le fichier original.

N'utilisez que open(2), mmap(2), munmap(2), msync(2), ftruncate(3), fstat(2), memcpy(3) et close(2). Vous ne pouvez appeler memcpy(3) qu'une seule fois.

Indice : msync(2) est une fonction qui assure que vos modifications faites en mémoire (donc à l'adresse retournée par mmap) seront également enregistrées dans le fichier. Consultez la documentation pour savoir comment l'utiliser (faites attention aux drapeaux). Appelez-la avant munmap() (ou vos modifications de la mémoire peuvent être perdues) !

Indice : La fonction ftruncate(3) est une fonction que vous n'aurez pas besoin d'utiliser fréquemment. Cependant, cette fonction est obligatoire pour réussir cet exercice ! Dans votre code, vous devez l'utiliser pour étendre la taille du fichier que vous avez ouvert pour copier le fichier original. Lorsque vous appellerez open (avec les drapeaux appropriés pour répondre aux exigences ci-dessus), la taille du nouveau fichier fraîchement créé sera mise à zéro. Donc, pour que la fonction mmap fonctionne, vous devrez étendre sa taille à celle que vous voulez en appelant ftruncate. Lisez la documentation liée et utilisez cette astuce AVANT d'appeler mmap !

Indice : Les permissions sont parfois difficiles à gérer. Soyez conscient que, lorsque vous utilisez mmap avec MAP_SHARED et PROT_WRITE, votre argument descripteur de fichier doit avoir été ouvert avec l'indicateur O_RDWR. Vous devez lire le fichier pour le copier en mémoire et vous demandez à écrire dans ce morceau de mémoire (avec le PROT_WRITE) donc vous avez aussi besoin de la permission d'écriture sur le fichier !


Question 1:

Ecrit ici le corps de la fonction:

/*
 * @pre file_name != NULL, nom du fichier originel
 *      new_file_name != NULL, nom du nouveau fichier (la copie)
 *
 * @post copie le contenues de {file_name} vers {new_file_name}.
 *       retourne 0 si la fonction se termine avec succès, -1 en cas d'erreurs.
 */
int copy(char *file_name, char *new_file_name) {
Question 2: Zone de test

Voici une zone vous permettants d'implémenter des tests. Attention Si vous utilisez printf() ne pas utiliser de retour à la ligne \n. Les résultats de votre test s'afficheront dans la zone de retour de l'exercice.

void montest(){