<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Setjmp%2Flongjmp</id>
	<title>Setjmp/longjmp - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Setjmp%2Flongjmp"/>
	<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Setjmp/longjmp&amp;action=history"/>
	<updated>2026-04-09T10:12:42Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Setjmp/longjmp&amp;diff=722&amp;oldid=prev</id>
		<title>Ahn9807: 새 문서: 분류:POSIX 시스템 콜  == 개요 == setjmp()와 longjmp()는 C언어의 goto문과 유사하지만 다소 차이가 있다. goto문 같은 경우는 실행중의 EIP(또는 Program Count)만 변경되지만, setjmp()/longjmp()는 프로그램의 스택도 변경시킨다. Goto문 같은 경우는 local jump를 지원하지만, setjmp는 nonlocal 점프도 할 수 있다. 즉 Goto문은 같은 함수내에서만 점프할 수 있지만, setjmp는 저장된 jmp_buf로 향...</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Setjmp/longjmp&amp;diff=722&amp;oldid=prev"/>
		<updated>2023-02-21T01:36:34Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:POSIX_%EC%8B%9C%EC%8A%A4%ED%85%9C_%EC%BD%9C&quot; title=&quot;분류:POSIX 시스템 콜&quot;&gt;분류:POSIX 시스템 콜&lt;/a&gt;  == 개요 == setjmp()와 longjmp()는 C언어의 goto문과 유사하지만 다소 차이가 있다. goto문 같은 경우는 실행중의 EIP(또는 Program Count)만 변경되지만, setjmp()/longjmp()는 프로그램의 스택도 변경시킨다. Goto문 같은 경우는 local jump를 지원하지만, setjmp는 nonlocal 점프도 할 수 있다. 즉 Goto문은 같은 함수내에서만 점프할 수 있지만, setjmp는 저장된 jmp_buf로 향...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류:POSIX 시스템 콜]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
setjmp()와 longjmp()는 C언어의 goto문과 유사하지만 다소 차이가 있다. goto문 같은 경우는 실행중의 EIP(또는 Program Count)만 변경되지만, setjmp()/longjmp()는 프로그램의 스택도 변경시킨다. Goto문 같은 경우는 local jump를 지원하지만, setjmp는 nonlocal 점프도 할 수 있다. 즉 Goto문은 같은 함수내에서만 점프할 수 있지만, setjmp는 저장된 jmp_buf로 향하여 점프하기 때문에, 같은 함수내에서 있을 필요가 없다. 중요한 사실은 점프문은 매우 위험하고 피해야할 프로그래밍 스킬이라는 것이다. &lt;br /&gt;
&lt;br /&gt;
: #include &amp;lt;setjmp.h&amp;gt; 헤더를 통해서 include한다. &lt;br /&gt;
: int setjmp(jmp_buf env) 직접 호출하면 0을 리턴하고 longjmp를 통해서 리턴하면 0이 아닌 값을 리턴하게 된다. &lt;br /&gt;
: void longjmp(jmp_buf env, int val)을 통해서 longjmp 구문에 들어가게 된다. val은 setjmp 호출에 대해 반환되는 값이다.&lt;br /&gt;
&lt;br /&gt;
주의해야 하는 것은 setjmp를 한 함수가 return되었을 경우 longjmp를 수행하면 현재 stack frame그대로 setjmp를 함수의 stackframe처럼 반영하여 함수를 실행하게 되기 때문에, 예측 할 수 없는 결과를 가져올 수 있다는 것이다. 따라서 setjmp와 longjmp는 주의깊게 사용되어져야 한다. 즉 setjmp를 한 함수가 return되면 그 setjmp를 한 함수로 longjmp를 수행해서는 안됀다. &lt;br /&gt;
== 예제 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;setjmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
void p1();&lt;br /&gt;
void intHandler();&lt;br /&gt;
jmp_buf env;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
        signal( SIGINT, intHandler );&lt;br /&gt;
        if( setjmp( env ) != 0 ){&lt;br /&gt;
                printf( &amp;quot;오류로 인해 복귀\n&amp;quot; );&lt;br /&gt;
                exit( 0 );&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
                printf( &amp;quot;처음 통과\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
        p1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void p1()&lt;br /&gt;
{&lt;br /&gt;
        while( 1 ){&lt;br /&gt;
                printf( &amp;quot;루프\n&amp;quot; );&lt;br /&gt;
                sleep( 1 );&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void intHandler()&lt;br /&gt;
{&lt;br /&gt;
        printf( &amp;quot;인터럽트\n&amp;quot; );&lt;br /&gt;
        longjmp( env, 1 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==참고==&lt;br /&gt;
# https://blackcon.tistory.com/142&lt;/div&gt;</summary>
		<author><name>Ahn9807</name></author>
	</entry>
</feed>