translate_address в c ++ \ linux - PullRequest
       6

translate_address в c ++ \ linux

0 голосов
/ 08 марта 2011

я пытаюсь создать пользовательские потоки в C ++, поэтому, пытаясь инициализировать их, я получаю ошибку компилятора: translate_address не был объявлен в этой области

#include <iostream>
#include <cstdlib>
#include <csignal>
#include <csetjmp>

#define JB_SP 6 //Location in the code
#define JB_PC 7 //Stack pointer
#define STACK_SIZE 10

typedef unsigned long address_t; //64bit address

sigjmp_buf jbuf[3];
char stack1[STACK_SIZE];

void f(){

}

void setup(){
    unsigned int sp, pc;
    sp = (address_t)stack1 + STACK_SIZE - sizeof(address_t);
    pc = (address_t)f;
    sigsetjmp(jbuf[0],1);
    (jbuf[0]->__jmpbuf)[JB_SP] = translate_address(sp);
    (jbuf[0]->__jmpbuf)[JB_PC] = translate_address(pc);
    sigemptyset(&jbuf[0]->__saved_mask);//empty saved signal mask

}


int main(){


    return 1;
}

Должен ли я включить это как? или есть другая проблема?

спасибо.

1 Ответ

1 голос
/ 08 марта 2011

translate_address не является функцией Linux.Если вы имеете в виду какую-то книгу или пример кода, он должен объяснить, откуда вы должны получить эту функцию.Если этого не произойдет, скорее всего, он не предназначен для Linux (или действительно, очень плохой справочник / пример).

Более того, вам НЕ следует напрямую изменять содержимое jmp_buf или sigjmp_buf.Это архитектура и платформо-зависимые структуры, и только библиотека C может связываться с ними.Поскольку содержимое структур зависит от ОС, если при изменении sigjmp_buf вы используете ссылку, предназначенную для какой-либо другой ОС, могут произойти плохие вещи.

Вместо этого следует использовать либо setcontext, getcontext и makecontext для пользовательских потоков (волокон) или pthread_create для потоков на уровне ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...