%SHTDN
Arrêt du système demandé ?
Indique si le système est en cours d'arrêt, pour qu'un traitement long puisse s'interrompre proprement.
Syntaxe
%SHTDN
- Résultat
- Un indicateur :
*ONsi un arrêt du système est demandé,*OFFdans le cas normal.
À quoi ça sert
Un traitement qui tourne des heures (batch de nuit, serveur qui boucle sur une file de données) doit pouvoir s'arrêter proprement quand le système va s'éteindre : terminer l'enregistrement en cours, fermer les fichiers, et non se faire interrompre au milieu d'une mise à jour. On teste %SHTDN à chaque tour de boucle.
Exemple 1 : Boucle de lecture qui surveille l'arrêt
**free
// %SHTDN : le systeme demande-t-il l'arret ? Test a placer dans une boucle longue.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed usage(*input);
dcl-s traites int(10);
snd-msg 'Arret demande au depart ? ' + %char(%shtdn);
read client;
dow not %eof(client);
// A chaque tour : si l'operateur arrete le systeme, on sort proprement.
if %shtdn;
snd-msg 'Arret du systeme demande : on s''arrete au client ' + %char(numcli);
leave;
endif;
traites += 1;
read client;
enddo;
close client;
snd-msg 'Clients traites : ' + %char(traites);
snd-msg 'Arret demande a la fin ? ' + %char(%shtdn);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Arret demande au depart ? 0
Clients traites : 5
Arret demande a la fin ? 0
À chaque client lu, la boucle teste %shtdn. Ici aucun arrêt n'est demandé : le test reste faux du début à la fin, et les 5 clients sont traités. En cas d'arrêt demandé, la boucle sortirait par leave.
Le piège
Pensez à le tester à chaque tour de boucle, pas seulement au départ. Dans l'exemple, la valeur est 0 (faux) au début comme à la fin : un arrêt du système n'a pas pu être provoqué pendant le test, donc la sortie par leave n'a pas été exécutée.