setjmp longjmp 예제

솔루션에서는 다른 예외에 대해 다른 유형을 정의할 수 없습니다. 우리의 솔루션은 함수 setjmp의 다른 반환 값에 다른 예외를 매핑합니다. 이렇게하려면 다음과 같은 정의를 사용합니다 : 다음은 setjmp 및 longjmp가 올바르게 작동하는지 확인하는 데 사용할 수있는 간단한 테스트 프로그램입니다. 1. setjmp (jmp_buf resume_here)를 먼저 호출해야합니다. 이렇게 하면 `resume_here`를 프로그램 상태 정보 비주얼라이제이션. 스택 상단에 대한 포인터 값, 프로그램 카운터 값 및 기타 정보로 초기화합니다. 처음 반환할 때 0을 반환합니다. “Setjump” 및 “Longjump”는 C 표준 라이브러리의 헤더 파일인 setjmp.h에 정의되어 있습니다.

setjmp/longjmp를 통해 “로컬이 아닌 고토”가 실행되면 정상적인 “스택 해제”가 발생하지 않습니다. 따라서 필요한 정리 작업도 발생하지 않습니다. 여기에는 파일 설명자 닫기, 버퍼 플러시 또는 힙 할당 메모리 해제가 포함될 수 있습니다. 이전 예제에서는 try-블록에서 수행된 작업에서 발생하는 모든 예외가 올바른 catch-black으로 전달됩니다. 예외 형식이 해당 블록의 코드보다 SomeExceptionType이 일치하는 경우 실행됩니다. 그렇지 않으면 예외가 실제 블록(있는 경우)을 포함하는 try-블록에 전달됩니다. setjmp 및 longjmp는 제어의 교차 절차 전송을 용이하게 하는 C 함수의 쌍입니다. 일반적으로 오류 후 알려진 된 좋은 지점에서 실행을 다시 시작 하도록 허용 하는 데 사용 됩니다. setjmp.h는 C 표준 라이브러리에 정의된 헤더로 “로컬이 아닌 점프”를 제공합니다. 상호 보완적인 기능 setjmp 및 longjmp는 이 기능을 제공합니다. 그러나, 그냥 goto 처럼, 하지만 더 나쁜, 당신은 이것을 사용 하는 방법을 정말 조심 해야. longjmp는 코드의 시작 부분으로 돌아갑니다.

setjmp 사이에 변경된 다른 모든 상태와 setjmp가 시작된 곳으로 돌아가는 다른 모든 상태에는 영향을 미치지 않습니다. 따라서 setjmp가 호출 된 곳으로 돌아갈 때 할당, 잠금, 반 초기화 된 데이터 구조 등이 여전히 할당되고 잠겨 있으며 반 초기화됩니다. 즉, 당신은 정말 당신이이 작업을 수행 장소에 대한 관심, 그것은 더 많은 문제를 일으키지 않고 longjmp를 호출 정말 괜찮습니다. 물론, 당신이 할 다음 일이 “재부팅”인 경우 [오류에 대한 메시지를 저장 한 후, 아마도] – 하드웨어가 나쁜 상태에 있다는 것을 발견 한 임베디드 시스템에서, 예를 들어, 다음 잘. 마찬가지로 C99는 longjmp가 현재 스택 프레임을 보존할 필요가 없습니다.