Ваша программа имеет неопределенное поведение, поскольку время жизни блока, в котором setjmp
был вызван b1
или b2
в обработчике сигналов, заканчивается, как только вызывается longjmp
(в самой следующей строке). В следующий раз, когда вы вызываете longjmp
, пытаясь вернуться к jmp_buf
, который больше не действителен, поведение не определено, и это проявляется в том, что состояние полностью повреждено.
Вы можете написать a взломайте , чтобы обойти это, используя флаг sigaltstack
и SA_ONSTACK
, чтобы обработчик сигнала имел несколько стеков, так что даже если jmp_buf
формально недействителен, на практике он не засорен. Но это не действительная программа, просто она работает на практике в некоторых системах (не во всех). В конечном счете, нет (действительного / надежного) способа сделать то, что вы просите, с помощью setjmp
и longjmp
; для переключения контекста требуется строго более сильный примитив, чем тот, который они предоставляют.