Introduction

Ce didacticiel est destiné aux nouveaux utilisateurs de la Simple Virtual Machine.

Dans ce didacticiel, vous allez intercepter les signaux système et déclencher du code.

Le temps de lecture de ce didacticiel est estimé à 15 minutes si les interruptions logicielles ont été abordés.

Mise en place

Pour commencer, créez le canevas de l'application dans le fichier exécutable materiel.svm en utilisant ce code :

#!/usr/bin/env svm
DESCRIPTION
Hardware interruptions example
END
LOG
DEBUG "Hardware interruptions" STYLE "default"
PLUGIN "svmcom.so"
PLUGIN "svmrun.so"
PROCESS "application"
	CODE "main" INLINE
		:debug BREAK
		:memory com.device*2/terminal, STR/s
		:interruption !com.interrupted retry
		:com.open com.terminal STDIN -> (terminal/0)
		:com.open com.terminal STDOUT -> (terminal/1)
	:label loop
		:com.write @(terminal/1) "loop: "
		:com.read @(terminal/0) com.line -> &s
		:goto loop
	:label display
		:com.message "Display: " @&s
		:return
	:label retry
		:run.retry
	:label end
		:com.message "End."
	END
END

Signaux UNIX

Lancez l'application, puis entrez quelques valeurs, puis appuyez sur control-c pour terminer l'exécution :

./materiel.svm
loop: a
loop: b
loop: c
loop: ^C

Maintenant, relancez l'application, puis depuis un autre terminal, exécutez la commande :

killall svm

Cela devrait également arrêter l'application. Dans les deux cas, un signal UNIX est envoyé à la machine virtuelle, qui s'arrête sur ce type de signal comme tout processus UNIX.

Interruptions matérielles

Comportement par défaut

En réalité, la machine virtuelle est sensible aux signaux UNIX : les signaux UNIX sont considérés comme des interruptions qui viennent du matériel.

Par défaut, la machine adopte un comportement qui ressemble à celui attendu par le système UNIX : un signal de terminaison arrête la machine proprement, un abandon arrête la machine brutalement, etc...

Gestionnaires d'interruption

Modifiez le code pour obtenir :

#!/usr/bin/env svm
DESCRIPTION
Hardware interruptions example
END
LOG
DEBUG "Hardware interruptions" STYLE "default"
PLUGIN "svmcom.so"
PLUGIN "svmrun.so"
PROCESS "application"
	CODE "main" INLINE
		:debug BREAK
		:memory com.device*2/terminal, STR/s
		:interruption GLOBAL TERMINATE end
		:interruption GLOBAL FIRST display
		:interruption !com.interrupted retry
		:com.open com.terminal STDIN -> (terminal/0)
		:com.open com.terminal STDOUT -> (terminal/1)
	:label loop
		:com.write @(terminal/1) "loop: "
		:com.read @(terminal/0) com.line -> &s
		:goto loop
	:label display
		:com.message "Display: " @&s
		:return
	:label retry
		:run.retry
	:label end
		:com.message "End."
	END
END

Lancez l'application, entrez une valeur, puis ouvrez un autre terminal et lancez :

killall -USR1 svm
killall -USR1 svm
killall svm

Les fonctions de gestion des interruptions sont bien appellées lorsqu'un signal est envoyé à la machine.

Les signaux UNIX sont considérés par la machine virtuelle comme des interruptions matérielles.

Tout comme les interruptions logicielles, le flot d'instructions peut être redirigé sur une fonction lorqu'une interruption matérielle atteint la machine virtuelle en utilisant un gestionnaire d'interruption global sur les interruptions internes de la machine virtuelle.

Conclusion

Vous venez de voir comment réagir aux signaux système dans une application.

Une application pleinement opérable doit pouvoir être capable de réagir convenablement lorsqu'un signal lui est envoyé. Grâce aux gestionnaires d'interruptions globaux, celà devient simple à mettre en œuvre dans une application.