getcontext(3) - wariua/manpages-ko GitHub Wiki

NAME

getcontext, setcontext - μ‚¬μš©μž λ¬Έλ§₯ μ–»κ±°λ‚˜ μ„€μ •ν•˜κΈ°

SYNOPSIS

#include <ucontext.h>

int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);

DESCRIPTION

μ‹œμŠ€ν…œ V 계열 ν™˜κ²½μ—μ„œλŠ” <ucontext.h>에 mcontext_t와 ucontext_tλΌλŠ” 두 κ°€μ§€ νƒ€μž…μ΄ 있으며 λ„€ κ°€μ§€ ν•¨μˆ˜ getcontext(), setcontext(), makecontext(3), swapcontext(3)λ₯Ό 톡해 ν•œ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ—¬λŸ¬ μ œμ–΄ μŠ€λ ˆλ“œλ“€ μ‚¬μ΄μ—μ„œ μ‚¬μš©μž μˆ˜μ€€ λ¬Έλ§₯ μ „ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

mcontext_t νƒ€μž…μ€ μž₯치 의쑴적이며 λ‚΄μš©μ΄ 감좰져 μžˆλ‹€. ucontext_t νƒ€μž…μ€ μ΅œμ†Œν•œ λ‹€μŒ ν•„λ“œλ“€μ„ κ°€μ§€κ³  μžˆλŠ” ꡬ쑰체이닀.

typedef struct ucontext_t {
    struct ucontext_t *uc_link;
    sigset_t          uc_sigmask;
    stack_t           uc_stack;
    mcontext_t        uc_mcontext;
    ...
} ucontext_t;

sigset_t와 stack_tλŠ” <signal.h>에 μ •μ˜λ˜μ–΄ μžˆλ‹€. μ—¬κΈ°μ„œ uc_linkλŠ” ν˜„μž¬ λ¬Έλ§₯이 μ’…λ£Œλ˜μ—ˆμ„ λ•Œ 재개될 λ¬Έλ§₯을 가리킀며 (ν˜„μž¬ λ¬Έλ§₯을 makecontext(3)으둜 λ§Œλ“  경우), uc_sigmaskλŠ” 이 λ¬Έλ§₯μ—μ„œ μ°¨λ‹¨λœ μ‹œκ·Έλ„λ“€μ˜ 집합이고 (sigprocmask(2) μ°Έκ³ ), uc_stack은 이 λ¬Έλ§₯μ—μ„œ μ‚¬μš©ν•˜λŠ” μŠ€νƒμ΄κ³  (sigaltstack(2) μ°Έκ³ ), uc_contextλŠ” μ €μž₯된 λ¬Έλ§₯의 μž₯μΉ˜λ³„ ν‘œν˜„μœΌλ‘œ 호좜 μŠ€λ ˆλ“œμ˜ μž₯치 λ ˆμ§€μŠ€ν„°λ“€μ΄ ν¬ν•¨λœλ‹€.

getcontext() ν•¨μˆ˜λŠ” ucpκ°€ κ°€λ¦¬ν‚€λŠ” ꡬ쑰체λ₯Ό ν˜„μž¬μ˜ ν™œμ„± λ¬Έλ§₯으둜 μ΄ˆκΈ°ν™” ν•œλ‹€.

setcontext() ν•¨μˆ˜λŠ” ucpκ°€ κ°€λ¦¬ν‚€λŠ” μ‚¬μš©μž λ¬Έλ§₯을 λ³΅μ›ν•œλ‹€. 호좜 성곡 μ‹œ λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έ λ¬Έλ§₯은 getcontext()λ‚˜ makecontext(3) 호좜둜 얻은 κ²ƒμ΄κ±°λ‚˜ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ„Έ 번째 인자둜 μ „λ‹¬λœ 것이어야 ν•œλ‹€.

getcontext() 호좜둜 얻은 λ¬Έλ§₯인 경우 κ·Έ 호좜이 방금 λ°˜ν™˜ν•œ κ²ƒμ²˜λŸΌ ν”„λ‘œκ·Έλž¨ 싀행이 이어진닀.

makecontext(3) 호좜둜 얻은 λ¬Έλ§₯인 경우 makecontext(3) 호좜 두 번째 인자둜 μ§€μ •ν–ˆλ˜ ν•¨μˆ˜ func 호좜둜 ν”„λ‘œκ·Έλž¨ 싀행이 이어진닀. func ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λ©΄ makecontext(3) 호좜 첫 번째 인자둜 μ§€μ •ν–ˆλ˜ ucp ꡬ쑰체의 uc_link λ©€λ²„λ‘œ 계속 μ§„ν–‰ν•œλ‹€. κ·Έ 멀버가 NULL이면 μŠ€λ ˆλ“œκ°€ λλ‚œλ‹€.

μ‹œκ·Έλ„ ν•Έλ“€λŸ¬ 호좜둜 얻은 λ¬Έλ§₯인 κ²½μš°μ— 이전 ν‘œμ€€ λ¬Έμ„œμ—μ„œλŠ” "μ‹œκ·Έλ„λ‘œ μ€‘λ‹¨λœ μΈμŠ€νŠΈλŸ­μ…˜ λ‹€μŒμ˜ ν”„λ‘œκ·Έλž¨ μΈμŠ€νŠΈλŸ­μ…˜μœΌλ‘œ ν”„λ‘œκ·Έλž¨ 싀행이 이어진닀"κ³  λ˜μ–΄ μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ SUSv2μ—μ„œ 이 λ¬Έμž₯이 μ œκ±°λ˜μ—ˆκ³  ν˜„μž¬ νŒμ •μ€ "κ·Έ κ²°κ³Όκ°€ λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•ŠμŒ"이닀.

RETURN VALUE

성곡 μ‹œ getcontext()λŠ” 0을 λ°˜ν™˜ν•˜λ©° setcontext()λŠ” λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€. 였λ₯˜ μ‹œ λ‘˜ λͺ¨λ‘ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμŒ.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
getcontext(), setcontext() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe race:ucp

CONFORMING TO

SUSv2, POSIX.1-2001, POSIX.1-2008μ—μ„œ 이식성 문제λ₯Ό 이유둜 getcontext() λͺ…μ„Έλ₯Ό μ œκ±°ν•˜μ˜€μœΌλ©° λŒ€μ‹  POSIX μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜κ²Œ μ‘μš©μ„ μž¬μž‘μ„±ν•˜κΈ°λ₯Ό κΆŒκ³ ν•˜κ³  μžˆλ‹€.

NOTES

이 λ©”μ»€λ‹ˆμ¦˜μ΄ κ°€μž₯ λ¨Όμ € κ΅¬μ²΄ν™”λœ 것은 setjmp(3)/longjmp(3) λ©”μ»€λ‹ˆμ¦˜μ΄μ—ˆλ‹€. κ·Έ λ©”μ»€λ‹ˆμ¦˜μ—μ„œλŠ” μ‹œκ·Έλ„ λ¬Έλ§₯ 처리λ₯Ό κ·œμ •ν•˜μ§€ μ•Šμ•˜κ³ , κ·Έλž˜μ„œ λ‹€μŒ 단계가 sigsetjmp(3)/siglongjmp(3) μŒμ΄μ—ˆλ‹€. 그리고 ν˜„μž¬ λ©”μ»€λ‹ˆμ¦˜μ—μ„œλŠ” 훨씬 더 μœ μ—°ν•œ μ œμ–΄κ°€ κ°€λŠ₯ν•˜λ‹€. ν•œνŽΈμœΌλ‘œ getcontext()μ—μ„œ λ°˜ν™˜λœ 것이 처음 ν˜ΈμΆœμ—μ„œ λŒμ•„μ˜¨ 것인지 setcontext() ν˜ΈμΆœμ„ ν†΅ν•œ 것인지 μ•Œμ•„λ‚Ό μ†μ‰¬μš΄ 방법이 μ—†λ‹€. μ‚¬μš©μžκ°€ λ”°λ‘œ 확인 방식을 κ³ μ•ˆν•΄μ•Ό ν•˜λŠ”λ°, λ ˆμ§€μŠ€ν„°λ“€μ΄ λ³΅μ›λ˜λ―€λ‘œ λ ˆμ§€μŠ€ν„° λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

μ‹œκ·Έλ„μ΄ λ°œμƒν–ˆμ„ λ•Œ 컀널이 ν˜„μž¬ μ‚¬μš©μž λ¬Έλ§₯을 μ €μž₯ν•˜κ³  μ‹œκ·Έλ„ ν•Έλ“€λŸ¬λ₯Ό μœ„ν•œ μƒˆ λ¬Έλ§₯을 λ§Œλ“ λ‹€. ν•Έλ“€λŸ¬μ—μ„œ longjmp(3)을 μ‚¬μš©ν•˜λ„λ‘ 놔둬선 μ•ˆ λœλ‹€. λ¬Έλ§₯κ³Ό κ΄€λ ¨ν•΄ μ–΄λ–»κ²Œ 될지 κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. λŒ€μ‹  siglongjmp(3)λ‚˜ setcontext()λ₯Ό μ‚¬μš©ν•˜λΌ.

SEE ALSO

sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), makecontext(3), sigsetjmp(3)


2017-09-15

⚠️ **GitHub.com Fallback** ⚠️