Sorbonne Université Master 2017 2018
PR : Travaux Dirigés 3. Signaux et processus

Cette séance explore les possibilités de communication entre processus avec les fonctions wait, kill et celles autour de sigsuspend.



1 Chaîne de processus

A l’aide de la fonction fork, ecrire un programme qui crée une chaîne de processus telle que le processus initial (celui du main) crée un processus qui à son tour en crée un second et ainsi de suite jusqu’à la création de N processus (en plus du processus initial). Au moment de sa création, le dernier processus de la chaîne affiche le Pid de tous les autres processus y compris celui du processus initial. Chacun des autres processus attend la terminaison de son fils, puis affiche son propre Pid (à l’aide de getpid), celui de son père (à l’aide de getppid) et celui de son fils avant de se terminer.

On souhaite de plus que le dernier processus créé tire une valeur aléatoire entre 0 et 100, et la transmette à son père comme statut de sortie. Utiliser wait et ses macros pour que le père récupère ce statut, le processus initial devant l’afficher avant de se terminer.

Pour produire la valeur aléatoire, utilisez rand ainsi :

(int)(rand () /(((double) RAND_MAX +1) /100))

Ecrire le programme de sorte que le fiche cette valeur aléatoire.

Exemple d'appel :
$PWD/bin/chaine_proc 10
Fichier à créer : src/chaine_proc.c

2 La fonction sigsuspend

On reprend l’exercice précédent, mais on s’interdit d’utiliser les fonctions wait et assimilées. A la place on utilisera les fonctions de la famille sigsuspend. Comment résoudre alors le problème en s’assurant qu’aucun processus ne se termine avant que tous les autres ne soient créées ? On s’assurera qu’aucun signal n’est perdu en endormant chaque processus 1 seconde après la création de son fils et avant attente de son signal.

Remarque : on ne demande plus de récupérer la valeur aléatoire ici.

Exemple d'appel :
$PWD/bin/suspend 10
Fichier à créer : src/suspend.c

3 Les Signaux SIGSTOP et SIGCONT

On reprend encore le même exercice, mais nous voulons que tous les processus, à l’exception du processus initial, soient suspendus par un signal SIGSTOP. Lorsqu’ils le sont tous, le processus initial affiche : Tous les descendants sont suspendus. L’exécution de ces processus doit alors reprendre pour que ceux-ci se terminent. De nouveau, il faut répondre sans utiliser les fonctions de la famille wait.

Remarque : lorsqu’un processus s’envoie un signal à lui-même, le signal est immédiatement transmis et éventuellement pris en charge, la reprise de l’exécution suivant l’appel à kill n’a lieu qu’après. En particulier même si cet appel à kill était la fin du programme, l’envoi du signal et sa prise en charge éventuelle auront eu lieu.

Exemple d'appel :
$PWD/bin/stop_and_go 10
Fichier à créer : src/stop_and_go.c

4 Annexes


makefile