makecontext

Autres langues

Langue: ja

Autres versions - même langue

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)