Перейти к содержимому



Работа с контекстом процесса

makecontext getcontext swapcontext контекст процесса

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 02 Декабрь 2012 - 00:08

С помощью функций makecontext, getcontext, swapcontext можно переключать пользовательский контекст внутри процесса. Данный пример демонстрирует организацию вызова функций с помощью переключения пользовательского контекста.

#include <stdio.h>
#include <ucontext.h>
/* Размер стеков в формируемых пользовательских контекстах */
#define STACK_SIZE		 4096
/* Пространство для стеков */
static char st1 [STACK_SIZE];
static char st2 [STACK_SIZE];
static ucontext_t ctx [3];
static void f1 (int arg) {
printf ("Started f1 with arg %d\n", arg);
if (swapcontext (&ctx [1], &ctx [2]) != 0)
		 perror ("SWAPCONTEXT-1");
printf ("Exit from function f1\n");
}
static void f2 (int arg1, int arg2) {
printf ("Started f2 with args %d, %d\n", arg1, arg2);
if (swapcontext (&ctx [2], &ctx [1]) != 0)
		 perror ("SWAPCONTEXT-2");
printf ("Exit from function f2\n");
}
int main (void) {
(void) getcontext (&ctx [1]);
printf ("First context:\nstack address %p, stack size %d\n",ctx[1].uc_stack.ss_sp, ctx[1].uc_stack.ss_size);
/* В соответствии с общими рекомендациями			 */
/* позаботимся о стеке для модифицируемых контекстов */
ctx[1].uc_stack.ss_sp = st1;
ctx[1].uc_stack.ss_size = sizeof (st1);
ctx[1].uc_link = &ctx [0];
makecontext (&ctx [1], (void (*) (void)) f1, 1, 2);
(void) getcontext (&ctx [2]);
ctx[2].uc_stack.ss_sp = st2;
ctx[2].uc_stack.ss_size = sizeof (st2);
ctx[2].uc_link = &ctx [1];
makecontext (&ctx [2], (void (*) (void)) f2, 2, 3, 4);
if (swapcontext (&ctx [0], &ctx [2]) != 0) {
		 perror ("SWAPCONTEXT-3");
		 return (1);
}
return 0;
}





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 скрытых пользователей

Рейтинг@Mail.ru