diff --git a/README.md b/README.md index a2766f4..aee575f 100644 --- a/README.md +++ b/README.md @@ -303,4 +303,8 @@ XXXXXXXX BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB |CCCCCCCCCCCCCCCC| - pour être dans les mêmes conditions, il faut être sur que le fichier à copier n'est pas en cache en mémoire. Générez un nouveau fichier de même taille, ou utilisez le programme [fadvise.c](TP2/Exo1/fadvise.c) qui permet de vider les blocs du cache pour un fichier quelconque. - utilisez strace pour tracer les appels systèmes de vos deux programmes. ->Le deuxième programme est beaucoup plus rapide que le premier car il utilise des buffers, alors que le premier programme lit et écrit octet par octet et fait plus d'appels systèmes. \ No newline at end of file +>Le deuxième programme est beaucoup plus rapide que le premier car il utilise des buffers, alors que le premier programme lit et écrit octet par octet et fait plus d'appels systèmes. + +## Exercice 2 + +>Écrire un programme qui copie un fichier en utilisant `mmap`. \ No newline at end of file diff --git a/TP2/Exo2/exo2.c b/TP2/Exo2/exo2.c new file mode 100644 index 0000000..b99d21f --- /dev/null +++ b/TP2/Exo2/exo2.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BLOCK_SIZE 1 + +int main(int argc, char *argv[]) +{ + int fin, + fout; + char buf[BLOCK_SIZE]; + struct stat st; + + assert( argc == 3 ); + + fin = open(argv[1],O_RDONLY); + assert( fin >= 0 ); + + fstat(fin, &st); + + char *src = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fin, 0); + assert(src != MAP_FAILED); + + fout = open(argv[2],O_CREAT|O_RDWR|O_TRUNC,0600); + assert( fout >= 0 ); + + ftruncate(fout, st.st_size); + + char *dst = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fout, 0); + assert(dst != MAP_FAILED); + + memcpy(dst, src, st.st_size); + + munmap(src, st.st_size); + munmap(dst, st.st_size); + + close(fin); + close(fout); + + return 0; + +} \ No newline at end of file