Hub Nexus
업데이트됨

작가아직 작성자가 없습니다맡기

개선할 점이 보이나요? 변경을 제안하세요.

후원

매거진 C programming · 40개 중 30번째 페이지

A little known fact is that most C implementations have built-in primitives that can be used for cooperative multitasking / coroutines. They are setcontext and setjmp.

setjmp

The function setjmp is used in a pair with longjmp to transfer execution to a different point in the code. It relies on an existing jmp_buf declaration.

#include

int main (void)
{
jmp_buf buf;

if (setjmp(buf) == 0)
{
/* This code is executed on the first call to setjmp. */
longjmp(buf, 1);
} else {
/* This code is executed once longjmp is called. */
}
return 0;
}

setjmp() stores the current execution point in memory, which remains valid as long as the containing function doesn't return. It initially returns 0. Control is returned to setjmp once longjmp is called with the original jmp_buf and the replacement return value.

Note that jmp_buf is passed to setjmp without using the address-of operator.

The easiest way to understand setjmp and longjmp, is that setjmp stores the state of the CPU which includes program counter, stack pointer, all the registers, including the bits of the flags register, at the location pointed to by jmp_buf, which is defined some LEN+1, which is enough bytes to store the registers of whatever CPU is involved. The longjmp(buf), never returns, because it restores the execution context from the contents of struct jmp_buf buf previously set by the call to setjmp, so execution continues after setjmp was called, but the return value of setjmp is not 0, but with the value passed as the second parameter to longjmp. This is somewhat similar to the fork() system call, which returns 0 to the child process, and the PID of the child process to the parent.

Where this page came from

This page was imported from Wikibooks. From “C programming” on Wikibooks, by its contributors, under CC BY-SA 4.0. Changed here: set as a page; navigation and edit links left out; each image under its own licence, credited in its caption.

Nobody has written it yet — it is the source material at a new address, which is why search engines are asked to skip it and why no one earns from it. It is up for grabs: take it on, and it is yours to rewrite and to earn from.

이 페이지가 속한 매거진C programming

언어English

이용 허락: CC BY-SA 4.0 · 출처 en.wikibooks.org

1

0

0

0

Spinner Logo

코멘트

Spinner Logo
버전: 2CC0 1.0 — public domain
The runaway star that left the Tarantula Nebula
버전: 2CC0 1.0 — public domain
The Blackwell School, where segregation had no law behind it
버전: 2CC0 1.0 — public domain
The Eagle Nebula, seen in the infrared
버전: 2CC0 1.0 — public domain
The house where the Equal Rights Amendment was written
버전: 2CC0 1.0 — public domain
The Aleutians, the forgotten front of the Second World War
버전: 2CC0 1.0 — public domain
The Cosmic Cliffs are not cliffs