diff --git a/TD4/ex1 b/TD4/ex1 new file mode 100644 index 0000000..2911ef5 Binary files /dev/null and b/TD4/ex1 differ diff --git a/TD4/ex1.c b/TD4/ex1.c new file mode 100644 index 0000000..d47d06c --- /dev/null +++ b/TD4/ex1.c @@ -0,0 +1,29 @@ +/* Proposer un programme c qui attrape tous les signaux. Dès qu’il attrape un signal, il +* affiche le signal reçu. +* Utiliser la commande kill dans le terminal sous le format suivant : kill –signal pid. (Essayez les +* commandes ctrl+c, ctrl+z, de redimensionner la fenêtre...)*/ +#include +#include +#include +#include + +void capturerSignal(const int sig) +{ + printf("\n Signal %d reçu\n", sig); +} + +int main(int argc, char const *argv[]) +{ + printf("Voici mon pid : %d\n", getpid()); + + for (int i = 1; i < NSIG; ++i) + { + if (signal(i, capturerSignal) == SIG_ERR) + { + printf("Erreur attente signal %d\n", i); + } + } + while (1); + + return 0; +} \ No newline at end of file diff --git a/TD4/ex2 b/TD4/ex2 new file mode 100644 index 0000000..e61bbef Binary files /dev/null and b/TD4/ex2 differ diff --git a/TD4/ex2.c b/TD4/ex2.c new file mode 100644 index 0000000..ebddcdf --- /dev/null +++ b/TD4/ex2.c @@ -0,0 +1,38 @@ +/* Proposer un programme c qui demande un pid (entier) et envoie tous les signaux au premier programme */ +#include +#include +#include +#include + +int pid; + +void lirePid() +{ + printf("Saisir un PID\n"); + scanf("%d", &pid); +} + +void envoyerSignal(const int signal) +{ + printf("\nEnvoi du signal %d\n", signal); + kill(pid, signal); +} + +int main(int argc, char const *argv[]) +{ + lirePid(); + + for (int signal = 1; signal < NSIG; signal++) + { + if (signal != 9) + { + envoyerSignal(signal); + } + sleep(1); + } + + // ceci pour tuer l'exercice 1 + envoyerSignal(9); + + return EXIT_SUCCESS; +} diff --git a/TD4/ex3 b/TD4/ex3 new file mode 100644 index 0000000..d42f439 Binary files /dev/null and b/TD4/ex3 differ diff --git a/TD4/ex3.c b/TD4/ex3.c new file mode 100644 index 0000000..c39de00 --- /dev/null +++ b/TD4/ex3.c @@ -0,0 +1,67 @@ +/* Donner un programme c qui génère n fils (n est passé en argument à la commande). Chaque fils écrit + * son PID ainsi que son numéro de création toutes les secondes. Le père tue tous ses fils après 5 + * secondes. (Signal 9) */ +#include +#include +#include +#include +#include + +void tuerFils(const int pid) +{ + printf("On tue le fils %d\n", pid); + kill(pid, 9); +} + +void tuerLesFils(const int fils[], const int nombre) +{ + for (int i = 0; i < nombre; ++i) + { + tuerFils(fils[i]); + } +} + +int main(int argc, char const *argv[]) +{ + if (argc != 2) + { + printf("On attend 1 argument\n"); + exit(EXIT_FAILURE); + } + + int nombre = atoi(argv[1]); + int fils[nombre]; + + for (int i = 0; i < nombre; i++) + { + switch (fils[i] = fork()) + { + case -1: + printf("Erreur fork. Arret du programme.\n"); + exit(EXIT_FAILURE); + case 0: + while (1) + { + printf("Le fils %d (%d), j'attends\n", i + 1, getpid()); + sleep(1); + } + } + } + + sleep(4); + + // on teste si on est le père, normalement pas besoin + if (fils[0] != 0) + { + tuerLesFils(fils, nombre); + } + + for (int j = 0; j < nombre; ++j) + { + waitpid(fils[j], NULL, 0); + } + + printf("Je suis le père. Fin du programme\n"); + + return EXIT_SUCCESS; +}