diff --git a/serie1/ex2/Makefile b/serie1/ex2/Makefile index 9e2b2e935845f12b4781d51b91bfcd65826b4a64..4e1e6837f6491e0238d443fa1444764740df5c6e 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 0000000000000000000000000000000000000000..eaa6ed18e68fa8692e363ce6c890ca14d41d3397 --- /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 7837ac637f751beb7e74d8fd4f5096bbc386451e..979867524c441d685d736e0f8acf383084ada8df 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");