Section courante

A propos

Section administrative du site

Ctrl+Break et interruptions d'erreur critique

Le DOS offre deux manières d'arrêter un programme pendant son exécution. Ces situations se produisent lorsque l'utilisateur appuie sur Ctrl+Break (Ctrl+C, ou lorsqu'une erreur critique se produit lors de l'accès à un périphérique externe (exemple : imprimante, disque dur, unité de disque,...). La combinaison de touches varie selon la configuration du PC, nous utiliserons Ctrl+Break de manière cohérente dans cette page.

Ctrl+Break

Appuyer sur Ctrl+Break pour arrêter un programme en cours d'exécution peut avoir de graves conséquences. Une fois que l'utilisateur a appuyé sur cette combinaison de touches, le DOS prend brusquement le contrôle du programme sans permettre au programme d'effectuer le "ménage" pouvant être nécessaire. Les fichiers ne sont pas fermés correctement, les vecteurs d'interruption détournés ne sont pas réinitialisés et la mémoire allouée n'est pas libérée. Le résultat final peut aller d'une perte de données à un plantage du système.

Afin d'éviter cela, le DOS appelle l'interruption 23h. Cette interruption est également connue sous le nom d'interruption Ctrl+Break. Lorsqu'un programme est lancé, cette interruption pointe sur une routine provoquant la fin du programme. Mais un programme est libre de sélectionner sa propre routine, gardant ainsi le contrôle de ce qui se passe lorsque l'utilisateur appuie sur Ctrl+Break.

Cependant, la routine d'interruption ne s'exécute pas immédiatement. Le drapeau d'interruption contrôle le moment où la routine d'interruption se produit. Ce drapeau peut être défini au prompt DOS à l'aide de la commande BREAK (ON/OFF) du DOS, ou à l'aide de la fonction 33h du DOS, sous-fonction 1. Si l'indicateur d'interruption est activé, chaque fois qu'une fonction du DOS de l'interruption 21h est appelé, le tampon du clavier sera vérifié pour voir si Ctrl+Break ou Ctrl+C a été pressé. Si le drapeau d'arrêt est désactivé, cette vérification sera effectuée uniquement lors de l'appel des fonctions DOS accédant aux périphériques d'entrée et de sortie standard.

Si ce test trouve la combinaison de touches appropriée, les registres du microprocesseur sont chargés avec les valeurs contenues dans la fonction DOS à exécuter. Ce n'est qu'après cela que l'interruption 23h est appelée.

Si un programme dirige cette interruption vers une routine qui lui est propre, il existe plusieurs façons de réagir. Par exemple, le programme pourrait ouvrir une fenêtre à l'écran demandant si l'utilisateur souhaite terminer le programme. Il peut également décider lui-même si le programme doit ou non se terminer.

Maintenance

Si le programme choisit d'arrêter l'exécution, une certaine forme de routine de nettoyage doit suivre. Une routine de ce type ferme tous les fichiers ouverts, réinitialise tous les pointeurs d'interruption modifiés et libère toute mémoire allouée. Après cela, la fonction 4Ch peut terminer le programme sans rendre le contrôle à l'appelant de l'interruption 23h.

Si Ctrl+Break doit être ignoré, l'instruction en langage assembleur IRET doit rendre le contrôle au DOS. Le programme doit alors s'assurer que tous les registres du processeur contiennent les mêmes valeurs qu'ils avaient lorsque l'interruption 23h a été appelée. Sinon, la fonction DOS appelée à l'origine ne peut pas être exécutée sans erreur.

Interruption d'erreur critique

Contrairement à l'interruption Ctrl+Break, l'appel d'interruption d'erreur critique est rarement une réaction à quelque chose que l'utilisateur fait intentionnellement. Il s'agit généralement d'une réaction à une erreur se produisant lors de l'accès à un périphérique externe, tel qu'une imprimante, un unité de disque ou un disque dur. Bien que l'utilisateur puisse corriger l'erreur dans de nombreux cas (par exemple, l'imprimante n'est pas allumée), d'autres erreurs peuvent être causées par des pannes matérielles nécessitant des réparations (par exemple, une erreur de lecture lors de l'accès au disque dur).

Pour tenir compte des différents types d'erreurs, l'interruption d'erreur critique (interruption 24h) pointe normalement vers une routine DOS affichant le message suivant ou un message similaire à l'écran et attend une entrée de l'utilisateur :

(A)bort (R)etry (I)gnore (F)ail

Cela efface l'écran du programme en cours d'exécution. De plus, cette interruption ne fournit pas une fin de programme "propre". Comme Ctrl+Break, le programme se trouve dans une situation où les fichiers ne sont pas correctement fermés, la mémoire allouée n'est pas libérée,...

L'installation d'un gestionnaire d'interruptions dans un programme pour remplacer le gestionnaire DOS peut également aider ici. Le DOS demande l'aide d'un registre de microprocesseur pour transmettre à ce gestionnaire diverses informations lorsqu'il est appelé. Cela aide le gestionnaire d'interruption à localiser la source de l'erreur. Le bit 7 du registre AH indique une erreur d'accès à la disquette ou au disque dur (bit 7 de O, ou une autre erreur (bit 7 activé). De plus, la paire de registres BP:SI pointe vers la tête du pilote de périphérique étant en cours d'exécution appelé lorsque l'erreur est apparue. Un code d'erreur détaillé est contenu dans les 8 bits inférieurs du registre DI et le contenu des 8 bits supérieurs n'est pas défini. Cela renvoie les codes d'erreur suivants :

Code Description
00h Le disque est protégé en écriture
01h Accéder à un périphérique inconnu
02h Disque pas prêt
03h Commande inconnue
04h Erreur CRC
05h Longueur de données erronée
06h Erreur de recherche
07h Type de périphérique inconnu
08h Secteur introuvable
09h Imprimante à court de papier
0Ah Erreur d'écriture
0Bh Erreur de lecture
0Ch Erreur générale

Lorsqu'il est appelé, le gestionnaire d'erreurs critiques peut répondre en ouvrant une fenêtre à l'écran demandant à l'utilisateur de décider d'ignorer l'erreur, de réessayer l'accès ou d'abandonner le programme. Cette dernière option peut uniquement demander à l'interruption d'appeler les fonctions DOS de 01h vers 0Ch. Cela signifie que le programme se termine brusquement, comme si vous appuyiez sur Ctrl+Pause. S'il est vrai que l'appel d'autres fonctions DOS dans le gestionnaire ne provoque aucune erreur en soi, le retour au DOS provoque un plantage du système. Ces gestionnaires ne sont pas non plus autorisés à terminer un programme via l'utilisation de la fonction 4Ch du DOS. Au lieu de cela, le gestionnaire doit retourner à son appelant à l'aide de l'instruction IRET. Avec cela, DOS attend un code dans le registre AL qui lui montrera comment réagir à l'erreur. Il interprète le contenu du registre AL comme suit :

Code Description
00h Ignorer l'erreur
01h Recommencez l'opération
02h Fin de programme avec l'interruption 23h
03h Fonction de fin appelée avec une erreur (DOS 3.0 et supérieur uniquement)

Le dernier code de sortie dans la liste ci-dessus représente la réaction la plus sensible à une erreur ne pouvant pas être corrigée en répétant l'opération (comme dans l'exemple où l'imprimante doit être allumée). La réception de ce code appel la fin normale de l'appel de fonction dans lequel l'erreur s'est produite. La fonction définit alors le drapeau de retenue pour signaler l'erreur. Bien que cela rende une erreur "critique" et une erreur "normale" indiscernables pour le programme, il est possible de les différencier en définissant un drapeau dans le gestionnaire d'erreurs critiques.



Dernière mise à jour : Lundi, le 23 janvier 2023