Rechercher une page de manuel
makecontext
Langue: ja
Version: 2001-11-15 (openSuse - 09/10/07)
Section: 3 (Bibliothèques de fonctions)
̾Á°
makecontext, swapcontext - ¥æ¡¼¥¶¥³¥ó¥Æ¥¥¹¥È¤òÁàºî¤¹¤ë½ñ¼°
#include <ucontext.h>void makecontext(ucontext_t *ucp, void *func(), int argc, ...);
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
ÀâÌÀ
System V Ū¤Ê´Ä¶¤Ç¤Ï¡¢ mcontext_t ¤ª¤è¤Ó ucontext_t ¤È¤¤¤¦ 2 ¤Ä¤Î·¿¤È¡¢ getcontext(2), setcontext(2), makecontext(), swapcontext() ¤È¤¤¤¦ 4 ¤Ä¤Î´Ø¿ô¤¬ <ucontext.h> ¤ÇÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢¤¢¤ë¥×¥í¥»¥¹ÆâÉô¤ÇÀ©¸æ²¼¤Ë¤¢¤ëÊ£¿ô¤Î¥¹¥ì¥Ã¥É´Ö¤Ç¡¢ ¥æ¡¼¥¶¥ì¥Ù¥ë¤Î¥³¥ó¥Æ¥¥¹¥ÈÀÚÂؤ¨¤¬¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£¤³¤ì¤é¤Î·¿¤È¡¢ºÇ½é¤Î 2 ¤Ä¤Î´Ø¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¢ getcontext(2) ¤ò»²¾È¤Î¤³¤È¡£
makecontext() ´Ø¿ô¤Ï¡¢¥Ý¥¤¥ó¥¿ ucp ¤¬»Ø¤¹¥³¥ó¥Æ¥¥¹¥È¤òÊѹ¹¤¹¤ë (ucp ¤Ï°ÊÁ°¤Î getcontext(2) ¸Æ¤Ó½Ð¤·¤ÇÆÀ¤é¤ì¤¿¤â¤Î¤Ç¤¢¤ë)¡£ makecontext() ¤òµ¯Æ°¤¹¤ëÁ°¤Ë¤Ï¡¢¸Æ¤Ó½Ð¤·¼Ô¤Ï¡¢¤³¤Î¥³¥ó¥Æ¥¥¹¥ÈÍÑ¤Ë ¿·¤·¤¤¥¹¥¿¥Ã¥¯¤ò³ÎÊݤ·¡¢¤½¤Î¥¢¥É¥ì¥¹¤ò ucp->uc_stack ¤ËÂåÆþ¤·¡¢ ¤µ¤é¤Ë¸å·Ñ¤Î¥³¥ó¥Æ¥¥¹¥È¤òÄêµÁ¤·¡¢¤½¤Î¥¢¥É¥ì¥¹¤ò ucp->uc_link ¤Ë ÂåÆþ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
¤³¤Î¥³¥ó¥Æ¥¥¹¥È¤¬¾Íè (setcontext(2) ¤Þ¤¿¤Ï swapcontext() ¤Ë¤è¤Ã¤Æ) ͸ú¤Ë¤µ¤ì¤ë¤È¡¢´Ø¿ô func ¤¬¸Æ¤Ð¤ì¡¢ °ú¤¿ô¤È¤·¤Æ argc °Ê¹ß¤ÎÀ°¿ô (int) °ú¤¿ô¤ÎÎó¤¬ÅϤµ¤ì¤ë¡£ ¸Æ¤Ó½Ð¤·¼Ô¤Ï argc ¤Ë¤³¤ì¤é¤Î°ú¤¿ô¤Î¸Ä¿ô¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ ¤³¤Î´Ø¿ô¤¬Ìá¤ë¤È¡¢¸å·Ñ¤Î¥³¥ó¥Æ¥¥¹¥È¤¬Í¸ú¤Ë¤Ê¤ë¡£ ¸å·Ñ¥³¥ó¥Æ¥¥¹¥È¤Î¥Ý¥¤¥ó¥¿¤¬ NULL ¤Î¾ì¹ç¡¢¤½¤Î¥¹¥ì¥Ã¥É¤¬½ªÎ»¤¹¤ë¡£
swapcontext() ´Ø¿ô¤Ï¸½ºß¤Î¥³¥ó¥Æ¥¥¹¥È¤ò ¥Ý¥¤¥ó¥¿ oucp ¤¬»Ø¤¹¹½Â¤ÂΤËÊݸ¤·¡¢ ¥Ý¥¤¥ó¥¿ ucp ¤¬»Ø¤¹¥³¥ó¥Æ¥¥¹¥È¤ò͸ú¤Ë¤¹¤ë¡£
ÊÖ¤êÃÍ
À®¸ù¤¹¤ë¤È¡¢ swapcontext() ¤ÏÊÖ¤é¤Ê¤¤ (¤·¤«¤·¸å¤Ë oucp ¤¬Í¸ú¤Ë¤Ê¤Ã¤¿¾ì¹ç¤Ë¤ÏÊ֤뤳¤È¤¬¤¢¤ë¡£ ¤³¤Î¤È¤¤Ë¤Ï swapcontext() ¤Ï 0 ¤òÊÖ¤¹¤è¤¦¤Ë¸«¤¨¤ë¡£) ¼ºÇÔ¤¹¤ë¤È¡¢ swapcontext() ¤Ï -1 ¤òÊÖ¤·¡¢ errno ¤ò¥¨¥é¡¼¤Ë±þ¤¸¤ÆÀßÄꤹ¤ë¡£¥¨¥é¡¼
- ENOMEM
- ¥¹¥¿¥Ã¥¯¤Ë³ä¤êÅö¤Æ¤ë¶õ´Ö¤¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£
½àµò
SUSv2, POSIX.1-2001.Ãí°Õ
ucp->uc_stack ¤Î²ò¼á¤Ï sigaltstack(2) ¤Î¾ì¹ç¤ÈƱ¤¸¤Ç¤¢¤ë¡£ ¤¹¤Ê¤ï¤Á¤³¤Î¹½Â¤ÂΤˤϡ¢ ¥¹¥¿¥Ã¥¯¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¥á¥â¥êÎΰè¤Î³«»Ï¥¢¥É¥ì¥¹¤ÈŤµ¤¬´Þ¤Þ¤ì¡¢ ¤³¤ì¤Ï¥¹¥¿¥Ã¥¯¤¬¿¤Ó¤ëÊý¸þ¤¬¤É¤Á¤é¤Ç¤¢¤ë¤«¤Ë¤Ï´Ø·¸¤·¤Ê¤¤¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥æ¡¼¥¶¥×¥í¥°¥é¥à¤Ï¤³¤Î·ï¤Ë¤Ä¤¤¤Æ¤Ï¿´ÇÛ¤·¤Ê¤¯¤Æ¤è¤¤¡£Îã
°Ê²¼¤Î¥µ¥ó¥×¥ë¡¦¥×¥í¥°¥é¥à¤Ï¡¢ getcontext(2), makecontext(), swapcontext(). ¤Î»ÈÍÑÊýË¡¤ÎÎã¤ò¼¨¤¹¤â¤Î¤Ç¤¢¤ë¡£ ¤³¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ê½ÐÎϤ¬ÆÀ¤é¤ì¤ë:
$ ./a.out main: swapcontext(&uctx_main, &uctx_func2) func2: started func2: swapcontext(&uctx_func2, &uctx_func1) func1: started func1: swapcontext(&uctx_func1, &uctx_func2) func2: returning func1: returning main: exiting
#include <ucontext.h> #include <stdio.h> #include <stdlib.h> static ucontext_t uctx_main, uctx_func1, uctx_func2; #define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0) static void func1(void) { printf("func1: started\n"); printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n"); if (swapcontext(&uctx_func1, &uctx_func2) == -1) die("swapcontext"); printf("func1: returning\n"); } static void func2(void) { printf("func2: started\n"); printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n"); if (swapcontext(&uctx_func2, &uctx_func1) == -1) die("swapcontext"); printf("func2: returning\n"); } int main(int argc, char *argv[]) { char func1_stack[16384]; char func2_stack[16384]; if (getcontext(&uctx_func1) == -1) die("getcontext"); uctx_func1.uc_stack.ss_sp = func1_stack; uctx_func1.uc_stack.ss_size = sizeof(func1_stack); uctx_func1.uc_link = &uctx_main; makecontext(&uctx_func1, func1, 0); if (getcontext(&uctx_func2) == -1) die("getcontext"); uctx_func2.uc_stack.ss_sp = func2_stack; uctx_func2.uc_stack.ss_size = sizeof(func2_stack); /* Successor context is f1(), unless argc > 1 */ uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1; makecontext(&uctx_func2, func2, 0); printf("main: swapcontext(&uctx_main, &uctx_func2)\n"); if (swapcontext(&uctx_main, &uctx_func2) == -1) die("swapcontext"); printf("main: exiting\n"); exit(EXIT_SUCCESS); }
´ØÏ¢¹àÌÜ
getcontext(2), sigaction(2), sigaltstack(2), sigprocmask(2), sigsetjmp(3)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre