From 9cf8c1470e9096171a5c4ad5f5160ba0022de3db Mon Sep 17 00:00:00 2001 From: Tom Moguljak Date: Thu, 21 Sep 2023 15:32:35 +0200 Subject: [PATCH] Ajout de l'exercice 1 et 2 du TP3 --- README.md | 16 +++++++++++++++- TP3/Exo1/ex1-stdio.c | 12 ++++++++++++ TP3/Exo1/ex1-syscall.c | 14 ++++++++++++++ TP3/Exo2/fork_and_fd1.c | 42 +++++++++++++++++++++++++++++++++++++++++ TP3/Exo2/fork_and_fd2.c | 42 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 TP3/Exo1/ex1-stdio.c create mode 100644 TP3/Exo1/ex1-syscall.c create mode 100644 TP3/Exo2/fork_and_fd1.c create mode 100644 TP3/Exo2/fork_and_fd2.c diff --git a/README.md b/README.md index dcb91f4..fa74268 100644 --- a/README.md +++ b/README.md @@ -323,4 +323,18 @@ XXXXXXXX BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB |CCCCCCCCCCCCCCCC| - une première passe avec `0xff` pour tous les octets. - une deuxième passe avec des valeurs aléatoires (on utilisera le pseudo-fichier `/dev/urandom`) - enfin, avant d'effacer le fichier, on le renomera de manière aléatoire. ->Toutes les E/S devront utilisées un cache. \ No newline at end of file +>Toutes les E/S devront utilisées un cache. + +# TP 3 : Processus + +## Exercice 1 + +> Compilez et exécutez [ex1-stdio](TP3/Exo1/ex1-stdio.c) et [ex1-syscall](TP3/Exo1/ex1-syscall.c). Expliquez. + +> Avec `stdio`, le printf écrit "NON" dans le cache, c'est pourquoi lors de l'utilisation du `fork` le printf écrit "NON" deux fois, alors qu'avec `syscall`, le write écrit "NON" directement dans la sortie standard, c'est pourquoi lors de l'utilisation du `fork` le printf écrit "NON" une seule fois. + +## Exercice 2 + +> 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 diff --git a/TP3/Exo1/ex1-stdio.c b/TP3/Exo1/ex1-stdio.c new file mode 100644 index 0000000..4bc5de2 --- /dev/null +++ b/TP3/Exo1/ex1-stdio.c @@ -0,0 +1,12 @@ +#include +#include +#include + + +int main(){ + + printf("NON"); + if (fork()) { + printf("OUI\n"); + } +} diff --git a/TP3/Exo1/ex1-syscall.c b/TP3/Exo1/ex1-syscall.c new file mode 100644 index 0000000..1b46b6a --- /dev/null +++ b/TP3/Exo1/ex1-syscall.c @@ -0,0 +1,14 @@ +#include +#include +#include + + +int main(){ + + //printf("NON"); + write(STDOUT_FILENO,"NON",3); + if (fork()) { + //printf("OUI\n"); + write(STDOUT_FILENO,"OUI\n",4); + } +} diff --git a/TP3/Exo2/fork_and_fd1.c b/TP3/Exo2/fork_and_fd1.c new file mode 100644 index 0000000..2c529b9 --- /dev/null +++ b/TP3/Exo2/fork_and_fd1.c @@ -0,0 +1,42 @@ +#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 outfd; + pid_t p; + + if (argc != 2){ + + printf("%s file\n",argv[0]); + exit(1); + } + + //p=fork(); + outfd = open(argv[1],O_WRONLY|O_CREAT,0644); + assert(outfd >= 0); + p=fork(); + switch(p){ + case (pid_t)-1 : + perror(NULL); + exit(2); + + case (pid_t)0 : + write(outfd,msg2,strlen(msg2)); + break; + default : + write (outfd,msg1,strlen(msg1)); + break; + } + close(outfd); +} diff --git a/TP3/Exo2/fork_and_fd2.c b/TP3/Exo2/fork_and_fd2.c new file mode 100644 index 0000000..7a63fe5 --- /dev/null +++ b/TP3/Exo2/fork_and_fd2.c @@ -0,0 +1,42 @@ +#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 outfd; + pid_t p; + + if (argc != 2){ + + printf("%s file\n",argv[0]); + exit(1); + } + + p=fork(); + outfd = open(argv[1],O_WRONLY|O_CREAT,0644); + assert(outfd >= 0); + //p=fork(); + switch(p){ + case (pid_t)-1 : + perror(NULL); + exit(2); + + case (pid_t)0 : + write(outfd,msg2,strlen(msg2)); + break; + default : + write (outfd,msg1,strlen(msg1)); + break; + } + close(outfd); +}