컴퓨터/프로그래밍2009. 4. 11. 21:11
http://plucky.tistory.com/trackback/3
Posted by 태씽
컴퓨터/소프트웨어2009. 4. 10. 19:46
foxtab -> 3D 탭 전환하는 기능
mouseless browsing -> 마우스 없이 사용가능 
foxmark -> 즐겨찾기 동기화
firebug, web developer -> 디버깅 툴
Posted by 태씽
setjmp 와 longjmp를 이용한 간단한 프로그램을 작성하라.

#include<setjmp.h>

int setjmp(jmp_buf env);
void longjum(jmp_buf env, int val);

setjmp
- setjmp를 호춯한 함수의 스택 환경과 레지스터 환경을 env에 저장
- 직접 호출된 경우에 0을, longjmp에 의해 호출된 경우에는 0 이외의 지정된 값을 리턴한다.

longjmp
- 현재의 스택 프레임을 setjmp에 의해 저장된 스택 환경과 레지스터 환경으로 복원, setjmp가 지정한 위치로 제어가 이동
- val 값은 setjmp의 리턴값, 여러개의 longjmp 함수도 함꼐 사용 가능
- env 변수는 전역 변수로 선언 한다.

위 두함수는 비지역적 분기로서 지역 분기 goto문과는 달리 스택 정보를 복원할 수 있어야 한다. 위 두함수는 비지역 분기로 서 중첩된 함수 호출에서의 인터럽트나 에러를 처리하는데 효과적이다.

비지역적 분기와 변수값의 변화

변수값의 변화
- 메모리에 저장된 변수들은 longjmp 호출시의 값을 유지
- CPU나 레지스터에 저장된 변수들은 setjmp 설정시의 값으로 복원

최적화 컴파일
- 최적화하지 않는 경우에는 레지스터 변수 이외의 변수는 메모리에 할당한다.
- 최적화 하는 경우에는 휘발성 변수만 메모리에 할당하고 나머지는 레지스터에 할당한다. 단, 레지스터에 저장된 값을 보장하지는 않는다.


예제 프로그램

#include<stdio.h>
#include<setjmp.h>

static void f1(int, int, int);
static void f2(void);

static jmp_buf jmpbuffer; //jump 버퍼 설정

int main(void)
{
    int count; //count 변수는 일반 변수
    register int val; //val 변수는 레지스터
    volatile int sum; //sum 변수는 휘발성
   
    count=2; val=3; sum=4;

    if(setjmp(jmpbuffer) ! = 0)//setjmp결과가 0이 아니면 longjmp에 의해서 호출된 경우
    {
        //setjmp는 jmpbuffer에 현재 스택환경과 레지스터를 저장한다.(그러니까 복귀할때 여기로 복귀가 된다는 말!)
        //만약 longjmp가 호출 되어서 jmpbuffer에 저장되 어있는 스택환경과 레지스터 환경이 복원 되면
        //이 경우 아래 문장이 실행이 된다.
        printf("롱점프를 하면 : count = %d, val = %d, sum = %d", count, val, sum);
        exit(0);   
    }
   
    count = 97; val = 98; sum = 99;
   
    f1(count, val, sum);
}

static void f1(int i, int j , int k)
{
    printf("f1() : count = %d, val = %d, sum = %d", i, j, k);
    f2();
}

static void f2(void)
{
    longjmp(jmpbuffer, 1);
    //longjmp 의 두번째 파라미터는 setjmp의
}


자세한 설명은 주석으로 처리하였고 실행 결과 컴파일 옵션을 넣을때와 아닐때가 다른것을 알 수있다.
위 그림은 컴파일 옵션을 넣지 않았을 때인데 이경우 모두 뒤의 결과를 따르게 된다.


위 그림은 컴파일 옵션에 -O를 넣었을때는 휘발성 변수 뺴고는 다 레지스터 영역에 저장하여 longjmp시 setjmp가 호출 되었던 영역으로 돌아가게 될때 레지스터 영역에 있는 변수가 복귀가 된다. count와 val은 레지스터 영역에 저장 sum은 메모리 영역이므로 count와 val은 2, 3으로 복귀가 되지만 sum은 99 그래로이다.








'CSE(컴퓨터 공학) > 유닉스 시스템' 카테고리의 다른 글

유닉스 과제 #4  (0) 2009.05.30
유닉스 과제 #3  (0) 2009.05.06
Posted by 태씽