Ошибка сегментации swapcontext()

Я пытаюсь создать простой пример Привет мир, используя 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() происходит ошибка сегментации. Я немного повозился и понял, что проблема в размере стека, который я назначаю контексту, но я не знаю, что я делаю неправильно.

PS я пробовал назначать sizeof(func1_stack) но все еще есть ошибка сегмента

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

1 ответ

Решение

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

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

memset(array,0,sizeof(array)));
Другие вопросы по тегам