From 2402cba95608643d326ac7e1d0f68a5581816087 Mon Sep 17 00:00:00 2001 From: Tom Moguljak Date: Mon, 25 Sep 2023 22:37:51 +0200 Subject: [PATCH] Ajout de l'exo 2 --- README.md | 6 +++++- TP3/Exo3/copy1byte.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 TP3/Exo3/copy1byte.c diff --git a/README.md b/README.md index fa74268..de6b69f 100644 --- a/README.md +++ b/README.md @@ -337,4 +337,8 @@ XXXXXXXX BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB |CCCCCCCCCCCCCCCC| > Compilez et exécutez [fork_and_fd1.c](TP3/Exo2/fork_and_fd1.c) et [fork_and_fd2.c](TP3/Exo2/fork_and_fd2.c). Expliquez. -> \ No newline at end of file +> Pour le premier programme, le `fork` est fait après l'ouverture du fichier, donc le père et le fils se partagent le même descripteur de fichier, si l'un écrit, l'offset va se mettre à jour pour que les deux écrivent à la suite. Pour le deuxième programme, le `fork` est fait avant l'ouverture du fichier, donc le père et le fils ont deux descripteurs de fichier différents, l'offset n'est pas partagé donc le contenu du fichier sera celui du dernier à écrire. + +## Exercice 3 + +> Que fait le programme [copy1byte.c](TP3/Exo3/copy1byte.c) ? Décommentez la ligne du `fork`. Expliquer ce qui se passe. \ No newline at end of file diff --git a/TP3/Exo3/copy1byte.c b/TP3/Exo3/copy1byte.c new file mode 100644 index 0000000..02fe937 --- /dev/null +++ b/TP3/Exo3/copy1byte.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define msg1 "je suis le pere" +#define msg2 "je suis le fils !!!" + +int main(int argc,char * argv[]){ + + int infd,outfd; + ssize_t nbread; + char buf[1]; + pid_t p; + + if (argc != 3){ + + printf("%s infile outfile\n",argv[0]); + exit(1); + } + + infd = open(argv[1],O_RDONLY); + assert(infd >= 0); + outfd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); + assert(outfd >= 0); + + //p=fork(); // <- decommentez cette ligne + + while(1){ + + nbread=read(infd,buf,sizeof(buf)); + if (nbread <=0 ) break; + write(outfd,buf,sizeof(buf)); + + } + + + close(infd); + close(outfd); +}