0

これが私の質問です。簡単な共有メモリ プログラムを作成しようとしています。基本的には、コードの一部(Program1)でファイルを開いてデータを読み取る必要があります(ファイルが初めて開かれるため、データがある場合)データを消去し、新しいベクトルを書き込みますその場合、他の部分 (プログラム 2) はデータを読み取ってデータを消去し、新しいデータを書き込む必要があります。

まず、この例を作成しました。(プログラム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!");

最初の例では、10 個の数値をベクトルとして書き込もうとしていますが、データを連結するだけの 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 であり、Android Developers ツールで JNI を使用してメッセージを返しています。

4

1 に答える 1

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;
}
于 2013-10-17T01:19:10.333 に答える