jeudi 15 février 2018

Chapitre 20 : lancement d'un thread



Dans ce programme, nous allons voir le lancement d’un thread qui tournera en parallèle du thread principal. Le thread principal attendra les signaux reçus par le thread fils et nous nous contenterons d’afficher les informations reçues.
Dans un premier temps j’ai essayé le call system CLONE mais cette fonction n’est pas implémentée sur mon Raspberry et j’ai donc utilisé le call system FORK code 02. Cette fonction dédouble entièrement le processus père et retourne dans le registre r0 soit 0 pour le thread fils soit le pid du père. Cela nous permet de distinguer maintenant les 2 threads et donc d’exécuter les instructions différentes. Si c’est le fils, nous appelons la routine exec_thread et si c’est le père nous exécutons les instructions parent.
Dans la routine du fils, nous appelons le Call system GETPPID code 40h pour récupérer le pid du père puis après un temps d’attente, nous appelons le call système PAUSE code 1Dh.  Cette dernière permet de mettre le thread fils en attente et à l’écoute des signaux qui peuvent le toucher. Pour cela nous récupérerons son pid et nous utiliserons la commande kill pour changer son état à partir de la console utilisateur.
Dans les instructions concernant le père, nous mettons dans une boucle le call système WAIT code 072h qui va attendre les signaux du fils. Les codes de chaque signal sont récupérés dans les 2 premiers octets de la zone mémoire qui a été passée en paramètre. Ici nous nous contentons d’afficher le contenu des zones jusqu’à recevoir le signal de fin du thread fils  pour sortir de la boucle et terminer le programme.
Nous lançons le programme par nomduprogramme ‘&  pour que celui ci tourne en arrière-plan (voir la documentation Linux ) et nous laisse l’accès à la console linux. En tapant la commande ps, nous voyons 2 fois le nom du programme avec 2 pid différents correspondant au 2 threads. Le pid le plus élevé correspond au thread du fils  (1976 dans l’exemple ci-dessous).

pi@raspberryVincent:~/vincent/asm/projet7 $ ps
  PID TTY          TIME CMD
 1894 pts/0    00:00:01 bash
 1975 pts/0    00:00:00 testfork
 1976 pts/0    00:00:00 testfork
 1979 pts/0    00:00:00 ps



Nous allons stopper le thread fils par la commande kill –STOP 1976, le relancer par kill –CONT 1976 et le tuer définitivement par kill –TERM 1976. Ce qui terminera aussi le thread du père pid 1975.
Vous pouvez regarder pour chaque cas, les informations transmises. Vous pouvez aussi dans la routine exec-thread mettre en commentaire l’appel système de PAUSE pour vérifier la fin normale du thread fils et le contenu du code retour (celui-ci pourra donc être différent suivant le travail effectué par le fils).
Ce programme est très simple et il reste à l’améliorer pour voir la gestion de plusieurs threads fils et le passage d’informations entre les threads père et fils.

Aucun commentaire:

Enregistrer un commentaire