함수 기능
함수 경계를 넘나드는 분기를 수행하기 위해 사용하는 라이브러리 함수
다른함수에 설정된 레이블로 점프
많은 함수호출로 깊이 중첩되어있을경우 해당 함수에서 나와 다른 상위레벨 함수로 이동가능
함수 원형
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
리턴 값 : 직접 호출된 경우에는 0 longjmp를 통해 호출된 경우에는 0이 아닌 값
함수 파라메터
env
setjmp가 위치한 스택환경과 레지스터 환경을 저장하는 환경변수
val
함수 예제
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<setjmp.h>
void ssu_nested_func(int loc_var, int loc_volatile, int loc_register);
static jmp_buf glob_buffer;
int main(void){
register int loc_register;
volatile int loc_volatile;
int loc_var;
loc_var = 10;
loc_volatile = 11;
loc_register = 12;
if(setjmp(glob_buffer)!=0){
printf("arter longjmp, loc_var = %d, loc_valatile = %d, loc_register = %d\n",loc_var,loc_volatile,loc_register);
exit(0);
}
loc_var=80;
loc_volatile=81;
loc_register=83;
ssu_nested_func(loc_var,loc_volatile, loc_register);
exit(0);
}
void ssu_nested_func(int loc_var, int loc_volatile, int loc_register){
printf("before longjmp, loc_var = %d,loc_volatile = %d, loc_register = %d\n",loc_var, loc_volatile,loc_register);
longjmp(glob_buffer,1);
}
함수 결과
리눅스시스템 프로그래밍 - 홍지만 저
교재 내에 있는 예제를 바탕으로 작성한 글 입니다.
'C & LINUX' 카테고리의 다른 글
C / LINUX wait(2) waitpid(2) (0) | 2022.05.02 |
---|---|
C / LINUX getpid(2) getppid(2) getuid(2) geteuid(2) getgid(2) getegid(2) (0) | 2022.05.02 |
C / LINUX vfork() (0) | 2022.05.02 |
C / LINUX fork() (0) | 2022.05.02 |
C / LINUX opendir(3) readdir(3) rewinddir(3) closedir(3) telldir(3) seekdir(3) (0) | 2022.05.02 |