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 $ psPID TTY TIME CMD1894 pts/0 00:00:01 bash1975 pts/0 00:00:00 testfork1976 pts/0 00:00:00 testfork1979 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.