Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels
SHTDN
Savoir si l'arrêt du système est demandé
Allume l'indicateur de la colonne 54-55 quand l'opérateur a demandé l'arrêt du système ; il reste éteint en traitement par lots.
Syntaxe
C SHTDN 90
- Facteur 1, facteur 2 et zone résultat
- Vides.
- Indicateurs (54-55)
- Obligatoire (sans lui :
QRG5127, « Aucun indicateur résultant n'est défini pour l'opération. La spécification n'est pas prise en compte. »). Il s'allume quand l'arrêt du système a été demandé, et reste éteint sinon. - Effet
- L'indicateur de la colonne 54-55 est mis à jour à chaque
SHTDN: allumé si l'arrêt est demandé, éteint sinon. Rien d'autre n'est modifié : le programme décide lui-même quoi faire (terminer sa boucle, fermer proprement).
À quoi ça sert
Un programme de service qui tourne longtemps (serveur de files de données, boucle d'attente) doit pouvoir s'arrêter proprement quand le système va s'éteindre. Il teste SHTDN à chaque tour et sort de sa boucle si l'indicateur s'allume.
Exemple 1 : Boucle surveillée
H* SHTDN : indicateur 90 = arret demande, toujours eteint en batch
C Z-ADD0 TOUR 30
C DO 3
C ADD 1 TOUR
C SHTDN 90
C 90 LEAVE
C TOUR DSPLY
C END
C *IN90 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
2
3
0
Trois tours : à chaque tour SHTDN interroge le système, et l'indicateur 90 est éteint (le LEAVE n'est jamais pris). Les trois tours sont affichés et l'indicateur reste à 0 après la boucle : un travail en traitement par lots ne reçoit pas de demande d'arrêt.
Le piège
L'indicateur est obligatoire. Un SHTDN sans indicateur en 54-55 est refusé : QRG5127 (gravité 30), « Aucun indicateur résultant n'est défini pour l'opération. La spécification n'est pas prise en compte. »
Ne comptez pas dessus pour vos tests. En traitement par lots, l'indicateur reste éteint, comme le montre l'exemple : le chemin « arrêt demandé » ne s'exécute jamais en recette.
En RPG ILE full free
En RPG IV, la fonction intégrée %shtdn renvoie *on quand l'arrêt est demandé : elle remplace l'opération et son indicateur.
if %shtdn;
leave;
endif;