2016-04-28 5 views
0

共有メモリに文字列の行列を書き込もうとしています。私は常にセグメンテーションフォールトエラーが発生しています。セグメント化エラーが発生し続けるのはなぜですか?どのように共有メモリにマトリックスを書き込むのですか?

/* Includes */ 
#include <unistd.h>  /* Symbolic Constants */ 
#include <sys/types.h> /* Primitive System Data Types */ 
#include <errno.h>  /* Errors */ 
#include <stdio.h>  /* Input/Output */ 
#include <stdlib.h>  /* General Utilities */ 
#include <pthread.h> /* POSIX Threads */ 
#include <string.h>  /* String handling */ 
#include <semaphore.h> /* Semaphore */ 

#include <wait.h> 
#include <sys/stat.h> 
#include <fcntl.h>  // Para as variáveis O_CREAT, O_EXCL etc 
#include <sys/mman.h> 
#include <time.h> 

#define str_len 10 

typedef struct{ 
    char **posix; 
} line; 

int main(void){ 

    int fd; 
    line *m; 
    int data_size = sizeof(line)*4; 
    //char m[4][3][str_len]; 
    //int i,j; 

    if ((fd = shm_open("/shm_ex13s", O_CREAT|O_RDWR,S_IRUSR|S_IWUSR)) < 0) { // Abrir o objeto da memória partilhada 
     fprintf(stderr, "ERROR: No shm_open()\n"); 
     exit(EXIT_FAILURE); 
    }                  
    ftruncate(fd, data_size);            // Ajustar o tamanho da memória partilhada                 
    m = (line *) mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // Mapear a memória partilhada 


    m->posix[0] = "ASDAS"; 

    //printf("%s\n", m[0][0]); 

    // Desfaz mapeamento 
    munmap(m, data_size); 
    // Fecha o descritor devolvido pelo shm_open 
    close(fd); 
    // O Leitor apaga a memória Partilhada do Sistema 
    shm_unlink("/shm_ex13s"); 
    exit(EXIT_SUCCESS); 

    exit(EXIT_SUCCESS); 
} 
+0

私は 'M-> posix'はそれを使用する前に適切に初期化されるとは思いません。 – MikeCAT

答えて

0

プロセス間でポインタを共有することはできません。各プロセスには独自の仮想メモリがあります。アドレスは共有できません。

命令

mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

とFuthermoreあなたはポインタのポインタが初期化されていない4 line変数の共有メモリを作成しています。

それにアクセスし、

m->posix[0] = "ASDAS"; 

とそれを割り当てることがUndefined Behaviorです:あなたはinizializedされていないposix[0]に割り当てます。

最後に、あなたがすると思われることはできません。 あなたができることは、共有メモリを作成してそれにリテラル文字列をコピーすることです。プロセス間でポインタを共有できないため、それらを参照することはできません。あなたがすることができる。例えば

char *string = "ASDAS"; 
char *m = (line *) mmap(NULL, strlen(string)+1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

strcpy(m, string, strlen(string)); 
関連する問題