Ошибка сегментации swapcontext () - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь создать простой пример hello world, используя swapcontext ()

Вот фрагмент кода:

#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>

static ucontext_t uctx_main, uctx_func1;

typedef struct test_struct 
{
    ucontext_t  context;
    int value;
}test_struct;

test_struct* array[10];

static void
func1(void)
{
    printf("func1: started\n");
    printf("func1: TESTING\n");
    printf("func1: returning\n");
}
void init()
{
    memset(array,NULL,10);

    array[0] = (test_struct*)malloc(sizeof(test_struct));
    array[0]->value = 10;

    getcontext(&array[0]->context);

    char* func1_stack = (char*)malloc(sizeof(char)*64);
    //char func1_stack[64];

    array[0]->context.uc_stack.ss_sp = func1_stack;
    array[0]->context.uc_stack.ss_size = 64;
    array[0]->context.uc_link = &uctx_main;

    makecontext(&array[0]->context, func1, 0);
}

int main(int argc, char *argv[])
{
   init();

   printf("VALUE: %d\n",array[0]->value);

   swapcontext(&uctx_main, &array[0]->context);

   printf("VALUE: %d\n",array[0]->value);
   printf("main: exiting\n");
   exit(0);
}

Но проблема в том, что когда программа выполняет swapcontext(), возникает ошибка сегментации. Я немного повозился и понял, что проблема в размере стека, который я назначаю контексту, но я не знаю, что я делаю неправильно.

P.S. Я попытался присвоить sizeof(func1_stack), но все еще получил ошибку сегмента

Кто-нибудь может дать мне подсказку?

1 Ответ

2 голосов
/ 19 марта 2012

Использование 64 в качестве размера стека в качестве закодированного соответствует фактическому заданному размеру стека. Однако 64 байта довольно малы для стека. Пример здесь использует 16K в качестве размера стека. Возможно, используемый вами размер слишком мал.

Кстати, memset, вероятно, не правильно. Это установка первых 10 байтов массива. На самом деле это ни на что не влияет, но, вероятно, должно быть следующее:

memset(array,0,sizeof(array)));
...