如何在共享内存中的矩阵上写入?

时间:2016-04-28 14:23:45

标签: c string matrix shared-memory

我试图在一块共享内存中写一个字符串矩阵。我经常遇到分段错误错误。为什么我一直收到分段错误错误?

/* 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);
 }

1 个答案:

答案 0 :(得分:0)

您无法在进程之间共享指针。每个进程都有自己的虚拟内存。地址无法共享。

进一步指导

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

您正在创建一个4 line变量的共享内存,其中指针的指针未初始化。

访问它并使用

进行分配
m->posix[0] = "ASDAS";

它是Undefined Behavior:您指定的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));