#include <setjmp.h> // <csetjmp> en C++
void siglongjmp( sigjmp_buf env, int value );
La fonction siglongjmp restaure l'environnement sauvegardé par sigsetjmp. Si cet environnement
a été sauvegardé avec l'option correspondante, le masque des signaux bloqués est également restauré.
Comme longjmp, cette fonction ne retourne pas à son appelant. L'exécution reprend au niveau de
sigsetjmp, qui semble alors retourner une seconde fois.
sigsetjmp.sigsetjmp. Si cette valeur vaut 0, sigsetjmp retournera 1.Cette fonction ne rend pas la main à son appelant.
L'exemple suivant déclenche un retour non local POSIX depuis une fonction appelée plus profondément.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#define _POSIX_C_SOURCE 200809L #include <setjmp.h> #include <stdio.h> #include <stdlib.h> static sigjmp_buf recoveryPoint; static void parseRecord( int recordNumber ) { if ( recordNumber == 3 ) { siglongjmp( recoveryPoint, recordNumber ); } printf( "Enregistrement %d accepté.\n", recordNumber ); } int main() { int code = sigsetjmp( recoveryPoint, 1 ); if ( code == 0 ) { parseRecord( 1 ); parseRecord( 3 ); } else { printf( "Enregistrement %d rejeté.\n", code ); } return EXIT_SUCCESS; } |
Le résultat produit est le suivant.
Enregistrement 1 accepté. Enregistrement 3 rejeté.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :