From b45c7bf6d1e8967f8438e6563f99c98dfbf7c815 Mon Sep 17 00:00:00 2001 From: "iliya.saroukha" <iliya.saroukha@hes-so.ch> Date: Sun, 24 Sep 2023 14:33:06 +0200 Subject: [PATCH] finished ex2 --- serie1/ex2/Makefile | 2 ++ serie1/ex2/ex2.md | 35 +++++++++++++++++++++++++++++++++++ serie1/ex2/prog.c | 1 + 3 files changed, 38 insertions(+) create mode 100644 serie1/ex2/ex2.md diff --git a/serie1/ex2/Makefile b/serie1/ex2/Makefile index 9e2b2e9..4e1e683 100644 --- a/serie1/ex2/Makefile +++ b/serie1/ex2/Makefile @@ -15,6 +15,8 @@ $(TARGET): prog.o $(CC) $(CFLAGS) -c $< @printf "\n" +.PHONY: clean + clean: rm -f *.o $(TARGET) diff --git a/serie1/ex2/ex2.md b/serie1/ex2/ex2.md new file mode 100644 index 0000000..eaa6ed1 --- /dev/null +++ b/serie1/ex2/ex2.md @@ -0,0 +1,35 @@ +# Expliquez précisément pourquoi le programme produit ce message à double + +Suite au fait que `stdout` est flushé **après** l'appel de `fork()`, vu que le +buffer est dupliqué dans le processus enfant, cela cause un affichage double. + +Afin d'éviter cela, il aurait fallu flushé `stdout` avant l'appel à `fork()`. + +```c +printf("Voilà un mystère digne de Sherlock Holmes !\n"); +fork(); +``` + +# Modifiez le code en utilisant `setbuf` afin de corriger l'affichage + +```c +#include <stdio.h> +#include <unistd.h> + +int main(void) { + setbuf(stdout, NULL); + printf("Voilà un mystère digne de Sherlock Holmes !"); + fork(); + printf("\n"); + return 0; +} +``` + +# Déterminez l'appel système utilisé lors de l'utilisation de la fonction `fork` + +Le nom de l'appel système est `clone` + +```sh +clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f7c06d06350) = 266166 + +``` diff --git a/serie1/ex2/prog.c b/serie1/ex2/prog.c index 7837ac6..9798675 100644 --- a/serie1/ex2/prog.c +++ b/serie1/ex2/prog.c @@ -2,6 +2,7 @@ #include <unistd.h> int main(void) { + setbuf(stdout, NULL); printf("Voilà un mystère digne de Sherlock Holmes !"); fork(); printf("\n"); -- GitLab