<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-os vector-sticky-header-enabled" lang="en" dir="ltr"><head>
    <meta charset="UTF-8">
    <title>Setjmp.h</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" type="image/png" href="./_res_/favicon.png">
    <link rel="canonical" href="https://en.wikipedia.org/wiki/Setjmp.h"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
    <meta name="ResourceLoaderDynamicStyles" content="">
    
    <link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
    <link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
    <link rel="stylesheet" type="text/css" href="./_res_/footer.css">
    <link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
  </head>
  <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Setjmp_h rootpage-Setjmp_h skin-vector-2022 action-view">
    <div class="mw-page-container">
      <div class="mw-page-container-inner">
        <div class="mw-content-container">
          <main id="content" class="mw-body">
            <header class="mw-body-header vector-page-titlebar">
              <h1 id="firstHeading" class="firstHeading mw-first-heading">setjmp.h</h1>
            </header>
            <a id="top"></a>
            <div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
              <div id="contentSub">
                <div id="mw-content-subtitle"></div>
              </div>
              <div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1305433154">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end   https://en.wikipedia.org/ */
</style>
<style data-mw-deduplicate="TemplateStyles:r1333133064">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:"\a0 · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end   https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1246091330">
/* start https://en.wikipedia.org/ */


.mw-parser-output .sidebar{width:22em;float:right;clear:right;margin:0.5em 0 1em 1em;background:var(--background-color-neutral-subtle,#f8f9fa);border:1px solid var(--border-color-base,#a2a9b1);padding:0.2em;text-align:center;line-height:1.4em;font-size:88%;border-collapse:collapse;display:table}body.skin-minerva .mw-parser-output .sidebar{display:table!important;float:right!important;margin:0.5em 0 1em 1em!important}.mw-parser-output .sidebar-subgroup{width:100%;margin:0;border-spacing:0}.mw-parser-output .sidebar-left{float:left;clear:left;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-none{float:none;clear:both;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-outer-title{padding:0 0.4em 0.2em;font-size:125%;line-height:1.2em;font-weight:bold}.mw-parser-output .sidebar-top-image{padding:0.4em}.mw-parser-output .sidebar-top-caption,.mw-parser-output .sidebar-pretitle-with-top-image,.mw-parser-output .sidebar-caption{padding:0.2em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-pretitle{padding:0.4em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-title,.mw-parser-output .sidebar-title-with-pretitle{padding:0.2em 0.8em;font-size:145%;line-height:1.2em}.mw-parser-output .sidebar-title-with-pretitle{padding:0.1em 0.4em}.mw-parser-output .sidebar-image{padding:0.2em 0.4em 0.4em}.mw-parser-output .sidebar-heading{padding:0.1em 0.4em}.mw-parser-output .sidebar-content{padding:0 0.5em 0.4em}.mw-parser-output .sidebar-content-with-subgroup{padding:0.1em 0.4em 0.2em}.mw-parser-output .sidebar-above,.mw-parser-output .sidebar-below{padding:0.3em 0.8em;font-weight:bold}.mw-parser-output .sidebar-collapse .sidebar-above,.mw-parser-output .sidebar-collapse .sidebar-below{border-top:1px solid #aaa;border-bottom:1px solid #aaa}.mw-parser-output .sidebar-navbar{text-align:right;font-size:115%;padding:0 0.4em 0.4em}.mw-parser-output .sidebar-list-title{padding:0 0.4em;text-align:left;font-weight:bold;line-height:1.6em;font-size:105%}.mw-parser-output .sidebar-list-title-c{padding:0 0.4em;text-align:center;margin:0 3.3em}@media(max-width:640px){body.mediawiki .mw-parser-output .sidebar{width:100%!important;clear:both;float:none!important;margin-left:0!important;margin-right:0!important}}body.skin--responsive .mw-parser-output .sidebar a>img{max-width:none!important}@media screen{html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle{background:transparent!important}html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle a{color:var(--color-progressive)!important}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle{background:transparent!important}html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle a{color:var(--color-progressive)!important}}@media print{body.ns-0 .mw-parser-output .sidebar{display:none!important}}


/* end   https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1238254908">
/* start https://en.wikipedia.org/ */


.mw-parser-output .c-standard-library .sidebar-content{text-align:left}


/* end   https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r886049734">
/* start https://en.wikipedia.org/ */


.mw-parser-output .monospaced{font-family:monospace,monospace}


/* end   https://en.wikipedia.org/ */
</style><table class="sidebar nomobile nowraplinks c-standard-library" role="navigation"><tbody><tr><th class="sidebar-title"><a href="C_standard_library" title="C standard library">C standard library</a> (libc)</th></tr><tr><th class="sidebar-heading">
General topics</th></tr><tr><td class="sidebar-content">
<ul><li><a href="C_data_types" title="C data types">Data types</a></li>
<li><a href="C_character_classification" title="C character classification">Character classification</a></li>
<li><a href="C_string_handling" title="C string handling">Strings</a></li>
<li><a href="C_mathematical_functions" title="C mathematical functions">Mathematics</a></li>
<li><a href="C_file_input/output" title="C file input/output">File input/output</a></li>
<li><a href="C_date_and_time_functions" title="C date and time functions">Date/time</a></li>
<li><a href="C_localization_functions" title="C localization functions">Localization</a></li>
<li><a href="C_dynamic_memory_allocation" title="C dynamic memory allocation">Memory allocation</a></li>
<li><a href="C_process_control" title="C process control">Process control</a></li>
<li><a href="C_signal_handling" title="C signal handling">Signals</a></li>
<li><a href="C_alternative_tokens" title="C alternative tokens">Alternative tokens</a></li></ul></td>
</tr><tr><th class="sidebar-heading">
Miscellaneous headers</th></tr><tr><td class="sidebar-content">
<ul><li><span class="monospaced">&lt;<a href="Assert.h" title="Assert.h">assert.h</a>&gt;</span></li>
<li><span class="monospaced">&lt;<a href="Errno.h" title="Errno.h">errno.h</a>&gt;</span></li>
<li><span class="monospaced">&lt;<a class="mw-selflink selflink">setjmp.h</a>&gt;</span></li>
<li><span class="monospaced">&lt;<a href="Stdarg.h" title="Stdarg.h">stdarg.h</a>&gt;</span></li></ul></td>
</tr><tr><td class="sidebar-navbar"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end   https://en.wikipedia.org/ */
</style></td></tr></tbody></table>
<p><b><span class="monospaced">&lt;setjmp.h&gt;</span></b> is a <a href="Header_file" class="mw-redirect" title="Header file">header</a> defined in the <a href="C_standard_library" title="C standard library">C standard library</a> to provide "non-local jumps": <a href="Control_flow" title="Control flow">control flow</a> that deviates from the usual <a href="Subroutine" class="mw-redirect" title="Subroutine">subroutine</a> call and return sequence. The complementary functions <b><code>setjmp</code></b> and <b><code>longjmp</code></b> provide this functionality.
</p><p>A typical use of <code>setjmp</code>/<code>longjmp</code> is implementation of an <a href="Exception_mechanism" class="mw-redirect" title="Exception mechanism">exception mechanism</a> that exploits the ability of <code>longjmp</code> to reestablish program or thread state, even across multiple levels of function calls. A less common use of <code>setjmp</code> is to create syntax similar to <a href="Coroutine#Implementations_for_C" title="Coroutine">coroutines</a>.
</p>

<div class="mw-heading mw-heading2"><h2 id="Member_functions">Member functions</h2></div>
<dl><dt><code class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><span class="kt">int</span><span class="w"> </span><span class="n">setjmp</span><span class="p">(</span><span class="kt">jmp_buf</span><span class="w"> </span><span class="n">env</span><span class="p">)</span></code></dt>
<dd>Sets up the local <code>jmp_buf</code> buffer and initializes it for the jump. This routine<sup id="cite_ref-macro_1-0" class="reference"><a href="#cite_note-macro-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> saves the program's calling environment in the environment buffer specified by the <code>env</code> argument for later use by <code>longjmp</code>. If the return is from a direct invocation, <code>setjmp</code> returns 0. If the return is from a call to <code>longjmp</code>, <code>setjmp</code> returns a nonzero value.</dd>
<dt><code class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><span class="kt">void</span><span class="w"> </span><span class="n">longjmp</span><span class="p">(</span><span class="kt">jmp_buf</span><span class="w"> </span><span class="n">env</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">value</span><span class="p">)</span></code></dt>
<dd>Restores the context of the environment buffer <code>env</code> that was saved by invocation of the <code>setjmp</code> routine<sup id="cite_ref-macro_1-1" class="reference"><a href="#cite_note-macro-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> in the same invocation of the program. Invoking <code>longjmp</code> from a nested signal handler is <a href="Undefined_behavior" title="Undefined behavior">undefined</a>. The value specified by <code>value</code> is passed from <code>longjmp</code> to <code>setjmp</code>. After <code>longjmp</code> is completed, program execution continues as if the corresponding invocation of <code>setjmp</code> had just returned. If the <code>value</code> passed to <code>longjmp</code> is 0, <code>setjmp</code> will behave as if it had returned 1; otherwise, it will behave as if it had returned <code>value</code>.</dd></dl>
<p><code>setjmp</code> saves the current environment (the program state), at some point of program execution, into a platform-specific data structure (<code>jmp_buf</code>) that can be used at some later point of program execution by <code>longjmp</code> to restore the program state to that saved by <code>setjmp</code> into <code>jmp_buf</code>. This process can be imagined to be a "jump" back to the point of program execution where <code>setjmp</code> saved the environment. The (apparent) <a href="Return_value" class="mw-redirect" title="Return value">return value</a> from <code>setjmp</code> indicates whether control reached that point normally (zero) or from a call to <code>longjmp</code> (nonzero). This leads to a common <a href="Programming_idiom" title="Programming idiom">idiom</a>: <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">setjmp</span><span class="p">(</span><span class="n">x</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* handle longjmp(x) */</span><span class="w"> </span><span class="p">}</span></code>.
</p><p><a href="POSIX" title="POSIX">POSIX</a>.1 does not specify whether <code>setjmp</code> and <code>longjmp</code> save and restore the current set of blocked <a href="Signal_(computing)" class="mw-redirect" title="Signal (computing)">signals</a>; if a program employs signal handling it should use POSIX's <code>sigsetjmp</code>/<code>siglongjmp</code>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Member_types">Member types</h2></div>
<dl><dt><code>jmp_buf</code></dt>
<dd>An array type suitable for holding the information needed to restore a calling environment.</dd></dl>
<p>The C99 Rationale describes <code>jmp_buf</code> as being an array type for <a href="Backward_compatibility" title="Backward compatibility">backward compatibility</a>; existing code refers to <code>jmp_buf</code> storage locations by name (without the <code>&amp;</code> address-of operator), which is only possible for array types.<sup id="cite_ref-rationale_2-0" class="reference"><a href="#cite_note-rationale-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>  It notes that it can simply be a one-member-long array with its single member being the actual data; indeed, this is the approach employed by the <a href="GNU_C_library" class="mw-redirect" title="GNU C library">GNU C library</a>, which defines the type as <code>struct __jmp_buf_tag[1]</code>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Caveats_and_limitations">Caveats and limitations</h2></div>
<p>When a "non-local goto" is executed via <code>setjmp</code>/<code>longjmp</code> in <a href="C%2B%2B" title="C++">C++</a>, normal "<a href="Stack_unwinding" class="mw-redirect" title="Stack unwinding">stack unwinding</a>" does not occur. Therefore, any required cleanup actions will not occur either. This could include closing <a href="File_descriptor" title="File descriptor">file descriptors</a>, flushing <a href="Buffer_(computer_science)" class="mw-redirect" title="Buffer (computer science)">buffers</a>, or freeing <a href="Dynamic_memory_allocation" class="mw-redirect" title="Dynamic memory allocation">heap-allocated memory</a>.
</p><p>If the function in which <code>setjmp</code> was called returns, it is no longer possible to safely use <code>longjmp</code> with the corresponding <code>jmp_buf</code> object. This is because the <a href="Stack_frame" class="mw-redirect" title="Stack frame">stack frame</a> is invalidated when the function returns. Calling <code>longjmp</code> restores the <a href="Stack_pointer" class="mw-redirect" title="Stack pointer">stack pointer</a>, which—because the function returned—would point to a non-existent and potentially overwritten or corrupted stack frame.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>Similarly, <a href="C99" title="C99">C99</a> does not require that <code>longjmp</code> preserve the current stack frame. This means that jumping into a function which was exited via a call to <code>longjmp</code> is undefined.<sup id="cite_ref-ISO/IEC_9899:1999_5-0" class="reference"><a href="#cite_note-ISO/IEC_9899:1999-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Example_usage">Example usage</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Simple_example">Simple example</h3></div>
<p>The example below shows the basic idea of setjmp. There, <code>main()</code> calls <code>first()</code>, which in turn calls <code>second()</code>. Then, <code>second()</code> jumps back into <code>main()</code>, skipping <code>first()</code>'s call of <code>printf()</code>.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;setjmp.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>

<span class="k">static</span><span class="w"> </span><span class="kt">jmp_buf</span><span class="w"> </span><span class="n">buf</span><span class="p">;</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">second</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">"second</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// prints</span>
<span class="w">    </span><span class="n">longjmp</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w"> </span><span class="c1">// jumps back to where setjmp was called - making setjmp now return 1</span>
<span class="p">}</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">first</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">second</span><span class="p">();</span>
<span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">"first</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// does not print</span>
<span class="p">}</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">buf</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="n">first</span><span class="p">();</span><span class="w"> </span><span class="c1">// when executed, setjmp returned 0</span>
<span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// when longjmp jumps back, setjmp returns 1</span>
<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"main</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// prints</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>When executed, the above program will output:
</p>
<div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">second</span>
<span class="go">main</span>
</pre></div>
<p>Notice that although the <code>first()</code> subroutine gets called, "<code>first</code>" is never printed, as <code>second()</code> never returns control to <code>first()</code>.  Instead, "<code>main</code>" is printed when the conditional statement <code>if (!setjmp(buf))</code> is checked a second time.
</p>
<div class="mw-heading mw-heading3"><h3 id="Exception_handling">Exception handling</h3></div>
<p>In this example, <code>setjmp</code> is used to bracket exception handling, like <a href="Try-catch_block" class="mw-redirect" title="Try-catch block"><code>try</code></a> in some other languages. The call to <code>longjmp</code> is analogous to a <code>throw</code> statement, allowing an exception to return an error status directly to the <code>setjmp</code>. The following code adheres to the <a href="C_(programming_language)#C99" title="C (programming language)">1999 ISO C standard</a> and <a href="Single_UNIX_Specification" title="Single UNIX Specification">Single UNIX Specification</a> by invoking <code>setjmp</code> in a limited range of contexts:<sup id="cite_ref-SUS_6-0" class="reference"><a href="#cite_note-SUS-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>As the condition to an <code>if</code>, <code>switch</code> or iteration statement</li>
<li>As above in conjunction with a single <code>!</code> or comparison with an integer constant</li>
<li>As a statement (with the return value unused)</li></ul>
<p>Following these rules can make it easier for the implementation to create the environment buffer, which can be a sensitive operation.<sup id="cite_ref-rationale_2-1" class="reference"><a href="#cite_note-rationale-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> More general use of <code>setjmp</code> can cause undefined behaviour, such as corruption of local variables; conforming compilers and environments are not required to protect or even warn against such usage. However, slightly more sophisticated idioms such as <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" style="white-space:nowrap;" dir="ltr"><span class="k">switch</span><span class="w"> </span><span class="p">((</span><span class="n">exception_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">setjmp</span><span class="p">(</span><span class="n">env</span><span class="p">)))</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span></code> are common in literature and practice, and remain relatively portable. A simple conforming methodology is presented below, where an additional variable is maintained along with the state buffer. This variable could be elaborated into a structure incorporating the buffer itself.
</p><p>In a more modern-looking example, the usual "try" block would be implemented as a setjmp (with some preparation code for multilevel jumps, as seen in <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">first</code>), the "throw" as longjmp with the optional parameter as the exception, and the "catch" as the "else" block under "try".
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;setjmp.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdlib.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string.h&gt;</span>

<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">first</span><span class="p">();</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">second</span><span class="p">();</span>

<span class="cm">/* Use a file scoped static variable for the exception stack so we can access</span>
<span class="cm"> * it anywhere within this translation unit. */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">jmp_buf</span><span class="w"> </span><span class="n">exception_env</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">exception_type</span><span class="p">;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="k">volatile</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">mem_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>

<span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">setjmp</span><span class="p">(</span><span class="n">exception_env</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="c1">// if we get here there was an exception</span>
<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"first failed, exception type: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">exception_type</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="c1">// Run code that may signal failure via longjmp.</span>
<span class="w">        </span><span class="n">puts</span><span class="p">(</span><span class="s">"calling first"</span><span class="p">);</span>
<span class="w">        </span><span class="n">first</span><span class="p">();</span>

<span class="w">        </span><span class="n">mem_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span><span class="w"> </span><span class="c1">// allocate a resource</span>
<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">strcpy</span><span class="p">(</span><span class="n">mem_buffer</span><span class="p">,</span><span class="w"> </span><span class="s">"first succeeded"</span><span class="p">));</span><span class="w"> </span><span class="c1">// not reached</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="n">free</span><span class="p">(</span><span class="n">mem_buffer</span><span class="p">);</span><span class="w"> </span><span class="c1">// NULL can be passed to free, no operation is performed</span>

<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">first</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="kt">jmp_buf</span><span class="w"> </span><span class="n">my_env</span><span class="p">;</span>

<span class="w">    </span><span class="n">puts</span><span class="p">(</span><span class="s">"entering first"</span><span class="p">);</span><span class="w"> </span><span class="c1">// reached</span>

<span class="w">    </span><span class="n">memcpy</span><span class="p">(</span><span class="n">my_env</span><span class="p">,</span><span class="w"> </span><span class="n">exception_env</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">my_env</span><span class="p">);</span><span class="w"> </span><span class="c1">// store value of exception_env in my_env since exception_env will be reused</span>

<span class="w">    </span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">setjmp</span><span class="p">(</span><span class="n">exception_env</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="k">case</span><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="c1">// if we get here there was an exception.</span>
<span class="w">            </span><span class="n">printf</span><span class="p">(</span><span class="s">"second failed, exception type: 3; remapping to type 1"</span><span class="p">);</span>
<span class="w">            </span><span class="n">exception_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>

<span class="w">        </span><span class="k">default</span><span class="o">:</span><span class="w"> </span><span class="c1">// fall through</span>
<span class="w">            </span><span class="n">memcpy</span><span class="p">(</span><span class="n">exception_env</span><span class="p">,</span><span class="w"> </span><span class="n">my_env</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">exception_env</span><span class="p">);</span><span class="w"> </span><span class="c1">// restore exception stack</span>
<span class="w">            </span><span class="n">longjmp</span><span class="p">(</span><span class="n">exception_env</span><span class="p">,</span><span class="w"> </span><span class="n">exception_type</span><span class="p">);</span><span class="w"> </span><span class="c1">// continue handling the exception</span>

<span class="w">        </span><span class="k">case</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="c1">// normal, desired operation</span>
<span class="w">            </span><span class="n">printf</span><span class="p">(</span><span class="s">"calling second"</span><span class="p">);</span><span class="w"> </span><span class="c1">// reached </span>
<span class="w">            </span><span class="n">second</span><span class="p">();</span>
<span class="w">            </span><span class="n">printf</span><span class="p">(</span><span class="s">"second succeeded"</span><span class="p">);</span><span class="w"> </span><span class="c1">// not reached</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="n">memcpy</span><span class="p">(</span><span class="n">exception_env</span><span class="p">,</span><span class="w"> </span><span class="n">my_env</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">exception_env</span><span class="p">);</span><span class="w"> </span><span class="c1">// restore exception stack</span>

<span class="w">    </span><span class="n">puts</span><span class="p">(</span><span class="s">"leaving first"</span><span class="p">);</span><span class="w"> </span><span class="c1">// never reached</span>
<span class="p">}</span>

<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">second</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">"entering second"</span><span class="w"> </span><span class="p">);</span><span class="w"> </span><span class="c1">// reached</span>

<span class="w">    </span><span class="n">exception_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
<span class="w">    </span><span class="n">longjmp</span><span class="p">(</span><span class="n">exception_env</span><span class="p">,</span><span class="w"> </span><span class="n">exception_type</span><span class="p">);</span><span class="w"> </span><span class="c1">// declare that the program has failed</span>

<span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">"leaving second"</span><span class="p">);</span><span class="w"> </span><span class="c1">// not reached</span>
<span class="p">}</span>
</pre></div>
<p>This program's output is:
</p>
<div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">calling first</span>
<span class="go">entering first</span>
<span class="go">calling second</span>
<span class="go">entering second</span>
<span class="go">second failed, exception type: 3; remapping to type 1</span>
<span class="go">first failed, exception type: 1</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Cooperative_multitasking">Cooperative multitasking</h3></div>
<p>C99 provides that <code>longjmp</code> is guaranteed to work only when the destination is a calling function, i.e., that the destination scope is guaranteed to be intact. Jumping to a function that has already terminated by <code>return</code> or <code>longjmp</code> is undefined.<sup id="cite_ref-ISO/IEC_9899:1999_5-1" class="reference"><a href="#cite_note-ISO/IEC_9899:1999-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> However, most implementations of <code>longjmp</code> do not specifically destroy local variables when performing the jump. Since the context survives until its local variables are erased, it could actually be restored by <code>setjmp</code>. In many environments (such as <a rel="nofollow" class="external text" href="https://www.gnu.org/software/pth/related.html">Really Simple Threads</a> and <a rel="nofollow" class="external text" href="https://github.com/simait/TinyTimber">TinyTimbers</a>), idioms such as <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" style="white-space:nowrap" dir="ltr"><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">child_env</span><span class="p">))</span><span class="w"> </span><span class="n">longjmp</span><span class="p">(</span><span class="n">caller_env</span><span class="p">);</span></code> can allow a called function to effectively pause-and-resume at a <code>setjmp</code>.
</p><p>This is exploited by thread libraries to provide <a href="Cooperative_multitasking" title="Cooperative multitasking">cooperative multitasking</a> facilities without using <code><a href="Setcontext" title="Setcontext">setcontext</a></code> or other <a href="Fiber_(computer_science)" title="Fiber (computer science)">fiber</a> facilities.
</p><p>Considering that <code>setjmp</code> to a child function will generally work unless sabotaged, and <code>setcontext</code>, as part of POSIX, is not required to be provided by C implementations, this mechanism may be portable where the <code>setcontext</code> alternative fails.
</p><p>Since no exception will be generated upon overflow of one of the multiple stacks in such a mechanism, it is essential to overestimate the space required for each context, including the one containing <code>main()</code> and including space for any signal handlers that might interrupt regular execution. Exceeding the allocated space will corrupt the other contexts, usually with the outermost functions first. Unfortunately, systems requiring this kind of programming strategy are often also small ones with limited resources.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;setjmp.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>

<span class="kt">jmp_buf</span><span class="w"> </span><span class="n">mainTask</span><span class="p">,</span><span class="w"> </span><span class="n">childTask</span><span class="p">;</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">call_with_cushion</span><span class="p">();</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">child</span><span class="p">();</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">mainTask</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="n">call_with_cushion</span><span class="p">();</span><span class="w"> </span><span class="c1">// child never returns, yield</span>
<span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="c1">// execution resumes after this "}" after first time that child yields</span>

<span class="w">    </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nb">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"Parent</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="w">        </span>
<span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">mainTask</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">            </span><span class="n">longjmp</span><span class="p">(</span><span class="n">childTask</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w"> </span><span class="c1">// yield - note that this is undefined under C99</span>
<span class="w">        </span><span class="p">}</span>
<span class="w">    </span><span class="p">}</span>
<span class="p">}</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">call_with_cushion</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="kt">char</span><span class="w"> </span><span class="n">space</span><span class="p">[</span><span class="mi">1000</span><span class="p">];</span><span class="w"> </span><span class="c1">// Reserve enough space for main to run</span>
<span class="w">    </span><span class="n">space</span><span class="p">[</span><span class="mi">999</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Do not optimize array out of existence</span>
<span class="w">    </span><span class="n">child</span><span class="p">();</span>
<span class="p">}</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">child</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nb">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"Child loop begin</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="w">        </span>
<span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">childTask</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">            </span><span class="n">longjmp</span><span class="p">(</span><span class="n">mainTask</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w"> </span><span class="c1">// yield - invalidates childTask in C99</span>
<span class="w">        </span><span class="p">}</span>

<span class="w">        </span><span class="n">printf</span><span class="p">(</span><span class="s">"Child loop end</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>

<span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">setjmp</span><span class="p">(</span><span class="n">childTask</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">            </span><span class="n">longjmp</span><span class="p">(</span><span class="n">mainTask</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w"> </span><span class="c1">// yield - invalidates childTask in C99</span>
<span class="w">        </span><span class="p">}</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/* Don't return. Instead we should set a flag to indicate that main()</span>
<span class="cm">       should stop yielding to us and then longjmp(mainTask, 1) */</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1327269900">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}body.skin-vector-2022 .mw-parser-output .reflist-columns-2{column-width:27em}body.skin-vector-2022 .mw-parser-output .reflist-columns-3{column-width:22.5em}.mw-parser-output .references[data-mw-group=upper-alpha]{list-style-type:upper-alpha}.mw-parser-output .references[data-mw-group=upper-roman]{list-style-type:upper-roman}.mw-parser-output .references[data-mw-group=lower-alpha]{list-style-type:lower-alpha}.mw-parser-output .references[data-mw-group=lower-greek]{list-style-type:lower-greek}.mw-parser-output .references[data-mw-group=lower-roman]{list-style-type:lower-roman}.mw-parser-output div.reflist-liststyle-upper-alpha .references{list-style-type:upper-alpha}.mw-parser-output div.reflist-liststyle-upper-roman .references{list-style-type:upper-roman}.mw-parser-output div.reflist-liststyle-lower-alpha .references{list-style-type:lower-alpha}.mw-parser-output div.reflist-liststyle-lower-greek .references{list-style-type:lower-greek}.mw-parser-output div.reflist-liststyle-lower-roman .references{list-style-type:lower-roman}


/* end   https://en.wikipedia.org/ */
</style><div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-macro-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-macro_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-macro_1-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">ISO C states that <code>setjmp</code> must be implemented as a macro, but POSIX explicitly states that it is undefined whether <code>setjmp</code> is a macro or a function.</span>
</li>
<li id="cite_note-rationale-2"><span class="mw-cite-backlink">^ <a href="#cite_ref-rationale_2-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-rationale_2-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf">C99 Rationale, version 5.10, April 2003</a>, section 7.13</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.cs.utk.edu/~mbeck/classes/cs560/360/notes/Setjmp/lecture.html">CS360 Lecture Notes — Setjmp and Longjmp</a></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=setjmp(3)&amp;msection=">setjmp(3)</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090726081425/http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=setjmp%283%29&amp;msection=">Archived</a> 2009-07-26 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a></span>
</li>
<li id="cite_note-ISO/IEC_9899:1999-5"><span class="mw-cite-backlink">^ <a href="#cite_ref-ISO/IEC_9899:1999_5-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-ISO/IEC_9899:1999_5-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf">ISO/IEC 9899:1999</a>, 2005, 7.13.2.1:2 and footnote 211</span>
</li>
<li id="cite_note-SUS-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-SUS_6-0">^</a></b></span> <span class="reference-text"><span class="neverexpand"><code><a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/setjmp.html">setjmp</a></code></span>:&nbsp;set jump point for a non-local goto&nbsp;–&nbsp;System Interfaces Reference, <a href="Single_Unix_Specification" class="mw-redirect" title="Single Unix Specification">The Single UNIX Specification</a>, Version 5 from <a href="The_Open_Group" title="The Open Group">The Open Group</a></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="Further_reading">Further reading</h2></div>
<ul><li><style data-mw-deduplicate="TemplateStyles:r1333433106">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./_mw_/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./_mw_/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./_mw_/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./_mw_/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#bf3c2c)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#bf3c2c)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end   https://en.wikipedia.org/ */
</style><cite id="CITEREFNidito2016" class="citation web cs1">Nidito, Francesco (July 2, 2016). <a rel="nofollow" class="external text" href="http://groups.di.unipi.it/~nids/docs/longjump_try_trow_catch.html">"Exceptions in C with Longjmp and Setjmp"</a>. <i>Groups.Di.Unipi.it</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-01-02</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=Groups.Di.Unipi.it&amp;rft.atitle=Exceptions+in+C+with+Longjmp+and+Setjmp&amp;rft.date=2016-07-02&amp;rft.aulast=Nidito&amp;rft.aufirst=Francesco&amp;rft_id=http%3A%2F%2Fgroups.di.unipi.it%2F~nids%2Fdocs%2Flongjump_try_trow_catch.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ASetjmp.h" class="Z3988"></span></li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1266661725">
/* start https://en.wikipedia.org/ */


.mw-parser-output .portalbox{padding:0;margin:0.5em 0;display:table;box-sizing:border-box;max-width:175px;list-style:none}.mw-parser-output .portalborder{border:1px solid var(--border-color-base,#a2a9b1);padding:0.1em;background:var(--background-color-neutral-subtle,#f8f9fa)}.mw-parser-output .portalbox-entry{display:table-row;font-size:85%;line-height:110%;height:1.9em;font-style:italic;font-weight:bold}.mw-parser-output .portalbox-image{display:table-cell;padding:0.2em;vertical-align:middle;text-align:center}.mw-parser-output .portalbox-link{display:table-cell;padding:0.2em 0.2em 0.2em 0.3em;vertical-align:middle}@media(min-width:720px){.mw-parser-output .portalleft{margin:0.5em 1em 0.5em 0}.mw-parser-output .portalright{clear:right;float:right;margin:0.5em 0 0.5em 1em}}


/* end   https://en.wikipedia.org/ */
</style>
<ul><li><span class="neverexpand"><code><a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/setjmp.html">setjmp</a></code></span>:&nbsp;set jump point for a non-local goto&nbsp;–&nbsp;System Interfaces Reference, <a href="Single_Unix_Specification" class="mw-redirect" title="Single Unix Specification">The Single UNIX Specification</a>, Version 5 from <a href="The_Open_Group" title="The Open Group">The Open Group</a></li>
<li><a rel="nofollow" class="external text" href="http://osdir.com/ml/gnu.mingw.msys/2006-05/msg00014.html">is there sigsetjmp/siglongjmp (again)</a> (about this functions in <a href="Mingw" class="mw-redirect" title="Mingw">mingw</a>/<a href="MSYS" class="mw-redirect" title="MSYS">MSYS</a>)</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
    This article is issued from <a class="external text" title="Last edited on 2026-02-04" href="https://en.wikipedia.org/wiki/?title=Setjmp.h&amp;oldid=1336646835">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
            </div>
          </main>
        </div>
      </div>
    </div>
     <script src="./_webp_/webpHandler.js"></script>
  

</body></html>