diff --git a/README.md b/README.md index a1f06e3..1948c8a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ >Soit le [programme](TP1/Exo1/adresses_virtuelles.c) suivant qui affiche les adresses virtuelles de certaines variables lors de l'exécution du processus. >En utilisant le (pseudo) fichier `/proc/pid/maps`, vérifiez à quel segment de pages ces adresses appartiennent. -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ ./adresses_virtuelles ``` @@ -19,7 +19,7 @@ t = 0x564bfc711040 m = 0x564bfd7e62a0 ``` -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ cat /proc/20/maps ``` @@ -57,7 +57,7 @@ m appartient au heap (564bfd7e6000-564bfd807000) 1. Allocation statique [buf.c](TP1/Exo1/ex1bis/buf.c) -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 51 ``` @@ -94,7 +94,7 @@ total kB 27036 17936 16612 2. Allocation sur la pile [stack.c](TP1/Exo1/ex1bis/stack.c) -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 57 ``` @@ -130,7 +130,7 @@ total kB 2460 1392 120 3. Allocation sur le tas [heap.c](TP1/Exo1/ex1bis/heap.c) -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 59 ``` @@ -167,7 +167,7 @@ total kB 52356 51280 50016 4. Allocation (gande quantité) sur le tas [huge.c](TP1/Exo1/ex1bis/huge.c) -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 61 ``` @@ -203,7 +203,7 @@ total kB 2720 1728 456 5. Allocation sur le mapping [mmap.c](TP1/Exo1/ex1bis/mmap.c) -```console +```shell tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 64 ``` @@ -394,4 +394,34 @@ tom@Error404:/mnt/c/Users/naser/Documents/scr/r305_dm/TP3/Exo6$ ps -o pid,ppid,p > 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 +## Exercice 7 + +> Écrire un programme qui pour `n>0` donné sur la ligne de commande, engendre l'arbre généalogique : +``` +0| + |\ 1 + | \ + | |\ 2 + | | \ + | | |\ ... + | | | \ + | | | |\ n + x x x x x +``` + +> Chaque processus choisit un nombre au hasard entre 0 et 127. Le processus 0 affichera la plus grande valeur choisie par tous les processus. + +> Remarque : on pourra modifier la séquence de nombres aléatoires en utilisant srand dans chaque processus créé. (pourquoi ?) + +# TP 4 : Signaux + +## Exercice 1 + +> Pour calculer le nombre pi, on utilise la méthode de Monte-Carlo. On tire aléatoirement des couples (x,y) de nombres de [0,1] x [0,1]. La probabilité qu'il tombe dans le disque de rayon 1 est exactement de pi/4. On procède à plusieurs tirages pour estimer la probilité correspondante. + +> En utilisant les signaux, mettre en place : +- avec `SIGALRM`, toutes les 5 secondes, l'affichage de la valeur pi en cours et le nombre de tirs effectués. +- avec `SIGINT` l'arrêt du programme (après la demande d'une confirmation), avec l'affichage du temps écoulé depuis son lancement, quand on fait `ctrl+C` au terminal. +- avec `SIGQUIT` la réinitialisation du calcul avec ctrl+\ depuis le terminal. (faites en sorte que toutes les valeurs restent cohérentes) + +> Dans chaque handler, les 2 autres signaux seront bloqués. \ No newline at end of file diff --git a/TP4/Exo1/helpers.c b/TP4/Exo1/helpers.c new file mode 100644 index 0000000..718fe40 --- /dev/null +++ b/TP4/Exo1/helpers.c @@ -0,0 +1,19 @@ +#include "helpers.h" +#include +#include + +int set_signal_handler(int signo, void (*handler)(int)) { + struct sigaction sa; + sa.sa_handler = handler; // call `handler` on signal + sigemptyset(&sa.sa_mask); // don't block other signals in handler + sa.sa_flags = SA_RESTART; // restart system calls + return sigaction(signo, &sa, NULL); +} + +double tstamp(void) { + struct timespec tv; + clock_gettime(CLOCK_REALTIME, &tv); + return tv.tv_sec + tv.tv_nsec * 1.0e-9; +} + + diff --git a/TP4/Exo1/helpers.h b/TP4/Exo1/helpers.h new file mode 100644 index 0000000..2084c6a --- /dev/null +++ b/TP4/Exo1/helpers.h @@ -0,0 +1,7 @@ +#ifndef _HELPERS_H +#define _HELPERS_H + +int set_signal_handler(int signo, void (*handler)(int)); +double tstamp(void); + +#endif diff --git a/TP4/Exo1/pi.c b/TP4/Exo1/pi.c new file mode 100644 index 0000000..ce51312 --- /dev/null +++ b/TP4/Exo1/pi.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include "helpers.h" +#include "helpers.c" + +uint64_t shots = 0, + shots_in = 0; + +double pi = 0, + t1; + +void alarm_handler(int) +{ + printf("pi = %f\n", pi); + printf("le nombre de tirs est de %f\n", (double)shots); + alarm(5); +} + +void int_handler(int) +{ + char c; + + alarm(0); + printf("Voulez-vous quitter ? (y/n)\n"); + c = getchar(); + + if (c == 'y' || c == 'Y') + { + printf("Le temps écoulé est de %f\n", tstamp() - t1); + exit(0); + } + + alarm(5); +} + +void quit_handler(int) +{ + shots = 0; + shots_in = 0; + t1 = tstamp(); +} + +int main(int argc, char *argv[]) +{ + double x, y; + t1 = tstamp(); + alarm(5); + set_signal_handler(SIGALRM, &alarm_handler); + set_signal_handler(SIGINT, &int_handler); + set_signal_handler(SIGQUIT, &quit_handler); + + while (1) + { + x = ((double)rand()) / (double)RAND_MAX; + y = ((double)rand()) / (double)RAND_MAX; + shots++; + + if ((x * x + y * y) <= 1) + shots_in++; + + pi = 4 * (double)(shots_in) / shots; + } +}