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