2013-10-15 3 views
0

вот мой вопрос. Я пытаюсь сделать простую программу общей памяти. В основном дело в том, что в одной части кода (Program1) необходимо открыть файл, считывающий данные (если есть, потому что есть первый случай открытия файла), стереть данные и записать новый вектор в ему, в другой части (Программа 2) необходимо прочитать данные, стереть данные и записать новые данные.Прочитать данные из памяти mmap

Теперь сначала я сделал этот пример. (Программа 1)

int i, result; 
int archivo,creaarchivo; 
char array[10]; 
srand(time(NULL)); 
//caddr_t mcompartida; 
void *mcompartida; 

//archivo=open(RUTA,O_CREAT|O_EXCL|O_RDWR,(mode_t)0777); 
archivo=open(RUTA,O_RDWR,(mode_t)0777); 
if (archivo<0) 
    { 
     return (*env)->NewStringUTF(env, "Error al leer "); 
     exit(EXIT_FAILURE); 
    } 

    result = lseek(archivo, SIZE-1, SEEK_SET); 

    if (result == -1) 
    { 
     close(archivo); 
     return (*env)->NewStringUTF(env, "Error al invocar lseek() memoria"); 
     exit(EXIT_FAILURE); 
    } 

    result = write(archivo, "",1); 

    if (result != 1) 
    { 
     close(archivo); 
     return (*env)->NewStringUTF(env, "Error escribiendo los bytes en memoria"); 
     exit(EXIT_FAILURE); 
    } 

    //mcompartida = mmap((caddr_t)0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, archivo, 0); 
    mcompartida = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, archivo, 0); 

    if (mcompartida == (caddr_t)-1) 
    { 
     close(archivo); 
     return (*env)->NewStringUTF(env, "Error mapeando el archivo"); 
     exit(EXIT_FAILURE); 
    } 

    close(archivo); 

// Se escribe en la memoria compartida 

for(i=0; i<10; i++) 
{ 
    sprintf(array,"%d ",i); 
    strcat((char *)mcompartida,array); 
} 

// Se libera la memoria compartida con munmap 

munmap (mcompartida, SIZE); 

if (munmap(mcompartida, SIZE) == -1) 
{ 
    return (*env)->NewStringUTF(env, "Error liberando la memoria compartida"); 
} 

return (*env)->NewStringUTF(env, "Memoria Compartida Creada =D!"); 

В первом примере я пытаюсь написать десять чисел как вектор, но я сделал это с strcat которым только объединяющим данных. (На данный момент я не стирать данные и считывания данных только запись)

Второй программы (Программа 2)

int i, result; 
int archivo,creaarchivo; 
char array_rx[10]; 
srand(time(NULL)); 
void *mcompartida; 

archivo=open(RUTA,O_RDWR,(mode_t)0777); 

if (archivo<0) 
{ 
    return (*env)->NewStringUTF(env, "Error al leer "); 
    exit(EXIT_FAILURE); 
} 

mcompartida = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, archivo, 0); 

if (mcompartida == -1) 
{ 
    close(archivo); 
    return (*env)->NewStringUTF(env, "Error mapeando el archivo"); 
    exit(EXIT_FAILURE); 
} 

close(archivo); 

// Se lee de memoria compartida 

for(i=0; i<10; i++) 
{ 
    strcat((char *)array_rx,mcompartida); 
    sscanf(array_rx,"%d",i); 
} 


// Se libera la memoria compartida con munmap 

munmap (mcompartida, SIZE); 

if (munmap(mcompartida, SIZE) == -1) 
{ 
    return (*env)->NewStringUTF(env, "Error liberando la memoria compartida"); 
} 

    return (*env)->NewStringUTF(env, "Memoria Compartida Leida =D"); 

Я пытаюсь читать данные, которые программируют 1 написали, но я не могу, любая помощь? Сначала я попытался сделать sscanf, но это не сработало, поэтому я подумал, что могу использовать strcat для копирования данных из разделяемой памяти в массив array_rx, но он не работал.

это в C, и я возвращаю сообщение с помощью JNI в Android-разработчике.

ответ

0

Неправильное использование sscanf().

const char *p = mcompartida; 
for(i=0; i<10; i++) { 
    //strcat((char *)array_rx,mcompartida); 
    //sscanf(array_rx,"%d",i); 
    int offset; // Offset where scanning stopped. 
    if (1 != sscanf(p, "%d%n", &array_rx[i], &offset)) { 
    break; // handle format error 
    } 
    p += offset; 
} 
Смежные вопросы