SETJMP(3)

명칭
sigsetjmp, siglongjmp, setjmp, longjmp, _setjmp, _longjmp, longjmperror - 비국소 분기

프로그램 라이브러리
libc

서식
<setjmp.h> int sigsetjmp(sigjmp_buf env, int savemask) void siglongjmp(sigjmp_buf env, int val) int setjmp(jmp_buf env) void longjmp(jmp_buf env, int val) int _setjmp(jmp_buf env) void _longjmp(jmp_buf env, int val) void longjmperror(void)

해설
sigsetjmp(), setjmp() 및 _setjmp() 함수는, 호출원의 환경을 env 에 보존합니다. 이러한 함수는 모두 0 (을)를 돌려줍니다.

대응한다 longjmp() 함수는, 각각 가장 새롭다 setjmp() 함수 호출에 의해 보존된 환경을 복원합니다. longjmp() 함수는 그 후로 복귀하므로, 대응한다 setjmp() 호출이, 0 은 아니고 val 그리고 지정된 값을 돌려주었던 바로 직후인것 같이 프로그램의 실행이 계속합니다.

호출의 페어는 서로 혼합할 수 있습니다. 즉, sigsetjmp() (와)과 siglongjmp() 및 setjmp() (와)과 longjmp() 의 각 편성은, 같은 프로그램내에서 사용할 수 있습니다. 그러나, 개개의 호출은 혼합할 수 없습니다. 예를 들어, setjmp() 에게 건네진다 env 인수는 siglongjmp() 에 건네줄 수 없습니다.

longjmp() routine는, setjmp() (을)를 호출한 routine로부터 복귀한 다음에는 호출할 수 없습니다.

액세스 가능한 오브젝트는 모두 longjmp() routine가 불려 간 시점에서의 값을 가집니다. 다만 예외로서 자동 기억역기간 계속하는 오브젝트이며, volatile 형태가 아니고, 한편 setjmp() 호출과 longjmp() 호출과의 사이에 변경되는 것에 임해서, 그 값이 부정이 되는 것은 제외합니다.

setjmp()/longjmp() 의 페어는 시그널 마스크를 보존해 복원합니다만, _setjmp()/_longjmp() 의 페어는 레지스터 세트와 스택 밖에 보존 및 복원하지 않습니다 ( sigprocmask(2) (을)를 참조 )

sigsetjmp()/siglongjmp() 함수의 페어는, 인수 savemask 하지만 0 이 아닌 경우, 시그널 마스크를 보존 및 복원합니다. 0 인 경우는, 레지스터 세트와 스택만이 보존됩니다.

에러
env 의 내용이 파괴되고 있는 경우, 또는 이미 복귀한 환경에 대응하고 있는 경우, longjmp() routine는, longjmperror(3) (을)를 호출합니다. longjmperror() (으)로부터 복귀하면(자), 프로그램은 중지합니다 ( abort(3) (을)를 참조 ) longjmperror() 의 디폴트 버젼에서는 “longjmp botch” 메세지를 표준 에러 출력에 인자해 복귀합니다. 유저 프로그램이 좀 더 예의범절 자주(잘) 탈출하는 것을 바란다면, 독자 버젼의 longjmperror() (을)를 써야 합니다.

관련 항목
sigaction(2), sigaltstack(2), signal(3)

표준
setjmp() 함수와 longjmp() 함수는 isoC 에 적합하고 있습니다. sigsetjmp() 함수와 siglongjmp() 함수는 p1003.1-88 에 적합하고 있습니다.