В MacOS X 10.6.2 заголовок <setjmp.h>
заканчивается использованием <i386/setjmp.h>
, и там говорится:
#if defined(__x86_64__)
/*
* _JBLEN is number of ints required to save the following:
* rflags, rip, rbp, rsp, rbx, r12, r13, r14, r15... these are 8 bytes each
* mxcsr, fp control word, sigmask... these are 4 bytes each
* add 16 ints for future expansion needs...
*/
#define _JBLEN ((9 * 2) + 3 + 16)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];
#else
/*
* _JBLEN is number of ints required to save the following:
* eax, ebx, ecx, edx, edi, esi, ebp, esp, ss, eflags, eip,
* cs, de, es, fs, gs == 16 ints
* onstack, mask = 2 ints
*/
#define _JBLEN (18)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];
#endif
Вероятно, вы найдете аналогичные требования для Linux - jmp_buf
содержит достаточно информации для хранения необходимого состояния. И, чтобы использовать его, вам действительно не нужно знать, что он содержит; все, что вам нужно сделать, это поверить, что разработчики поняли это правильно. Если вы хотите изменить реализацию, вам, конечно, нужно это понять.
Обратите внимание, что setjmp и longjmp очень специфичны для машины. Прочитайте Plauger " Стандартная библиотека C " для обсуждения некоторых вопросов, связанных с их реализацией. Более современные чипы затрудняют реализацию очень хорошо.