From fbd393debc640e0e353e9d609dc6815fe329bf06 Mon Sep 17 00:00:00 2001 From: Tom Moguljak Date: Wed, 27 Sep 2023 17:17:45 +0200 Subject: [PATCH] Ajout de l'exo 6 --- README.md | 37 ++++++++++++++++++++++++++++++++++++- TP3/Exo6/session.c | 18 ++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 TP3/Exo6/session.c diff --git a/README.md b/README.md index 1e552fd..a1f06e3 100644 --- a/README.md +++ b/README.md @@ -359,4 +359,39 @@ XXXXXXXX BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB |CCCCCCCCCCCCCCCC| - imprimer le retour de fork(), getpid(), getppid(). - attendre la fin de son fils (wait()), et imprimer son code de retour. -- afficher alors la liste de tous les processus actifs (execl() avec ps -ef). \ No newline at end of file +- afficher alors la liste de tous les processus actifs (execl() avec ps -ef). + +## Exercice 5 + +> Le but de l'exercice est de détecter la présence d'un zéro dans un tableau `unsigned char` de taille `SIZE` en découpant le travail entre plusieurs processus. + +> Combien y-at-il de 0 au plus dans le tableau ? Complétez la fonction `search`, et testez. + +1. Première version. Modifiez le programme pour que le processus crée un fils. Le fils et le père cherche chacun le zéro dans une moitié du tableau. Le fils communique le résultat à son père. Celui-ci, à l'aide de son propre travail, donnera la réponse. + +2. Deuxième version. Votre programme accepte sur la ligne de commande un entier n entre 1 et 100. Le programme crée n fils qui cherche chacun dans une partie du tableau. Le père attend la fin de chacun de ses fils, récupère leur résultat et affiche la réponse. + +3. Troisième version. On améliore la version précédente. Lorsque qu'un fils trouve le 0 dans le tableau, et que le père en est averti, faites en sorte que les autres fils vivants se terminent. On utilisera la primitive `kill()` qui perment d'envoyer le signal de terminaison (`SIGTERM`) à tout un groupe. + +## Exercice 6 + +> Exécutez le programme [session.c](TP3/Exo6/session.c) et interprétez avec `ps` les informations `pid,ppid,pgid,sess,tpgid` des processus créés. + +```shell +tom@Error404:/mnt/c/Users/naser/Documents/scr/r305_dm/TP3/Exo6$ ./session + +session = 9 +session = 8442 +``` + +```shell +tom@Error404:/mnt/c/Users/naser/Documents/scr/r305_dm/TP3/Exo6$ ps -o pid,ppid,pgid,sess,tpgid + + PID PPID PGID SESS TPGID + 103 102 103 103 8443 + 8443 103 8443 103 8443 +``` + +> On peut voir qu'on a bien créé un processus fils, mais vu qu'on est pas leader de session on ne peut pas créer de nouvelle session, c'est pourquoi `sess` et `tpgid` sont les mêmes que le père. + +## Exercice 7 \ No newline at end of file diff --git a/TP3/Exo6/session.c b/TP3/Exo6/session.c new file mode 100644 index 0000000..2298fef --- /dev/null +++ b/TP3/Exo6/session.c @@ -0,0 +1,18 @@ +#include +#include + + + +int main(int argc, char *argv[]) +{ + if (fork()){ + printf("session = %d\n",getsid(getpid())); + while(1); + } else { + setsid(); + printf("session = %d\n",getsid(getpid())); + while(1); + } + return 0; +} +