setjmp et longjmp – comprendre avec des exemples

Je connais la définition de setjmp et de longjmp. setjmp stocke l’environnement dans le contexte de la stack et l’autre restaure.

Mais je pense qu’il y a quelque part un manque de compréhension de ma part. Quelqu’un peut-il m’expliquer, à l’aide de bons exemples, comment puis-je assurer, et comment il sera sauvé et comment il sera restauré?

J’ai vu beaucoup de registres de processeurs pointés dans jmp_buf. Mais comment puis-je assurer qu’il soit restauré?

Aidez-moi à expliquer avec des exemples soignés. J’ai googlé et renvoyé à d’autres questions avec débordement de stack, mais aucun ne donne des exemples clairs.

Énorme énorme merci d’avance.

PS: Il ne devrait s’agir que d’un contexte Linux / Unix.

Lors de l’appel de longjmp() , tous ces registres sont restaurés automatiquement et l’exécution continue à l’appel correspondant à setjmp() , mais cette fois, setjmp() a une valeur de retour différente (similaire à fork() enfant).

setjmp() / longjmp() ne sauvegarde qu’un environnement limité. En particulier, ils sauvegardent simplement le pointeur de la stack, pas la stack complète, de sorte que vous ne pouvez que retourner à la même fonction ou à une fonction appelante. POSIX a setcontext() , qui permet de basculer entre les stacks, ce qui le rend plus immédiatement utile pour implémenter des éléments tels que les threads d’espace utilisateur (fibrilles, fils verts, …).