Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用共享内存共享char**变量_C_Pointers_Shared Memory - Fatal编程技术网

如何使用共享内存共享char**变量

如何使用共享内存共享char**变量,c,pointers,shared-memory,C,Pointers,Shared Memory,我使用共享内存在两个进程之间进行通信。我正在使用字符**附加到共享地址空间。问题是,当我在生产者上填充数据,然后将消费者附加到地址空间时,没有数据被传输。我只得到空值 这是我的制作人的片段 // create shared memory shm_handle = shmget(key, BUFF_SIZE * PAGE_SIZE, IPC_CREAT | 0644); printf("\nhandle is %d\n", shm_handle); // valid handle? if (shm

我使用共享内存在两个进程之间进行通信。我正在使用字符**附加到共享地址空间。问题是,当我在生产者上填充数据,然后将消费者附加到地址空间时,没有数据被传输。我只得到空值

这是我的制作人的片段

// create shared memory
shm_handle = shmget(key, BUFF_SIZE * PAGE_SIZE, IPC_CREAT | 0644);
printf("\nhandle is %d\n", shm_handle);
// valid handle?
if (shm_handle == -1) {
  printf("shared memory creation failed\n");
  exit(0);
}
// attach to shared block, see man pages for detail
buf = (char**) shmat(shm_handle, 0, 0);
if (buf == (char **) -1) {
  printf("Shared memory attach failed");
  exit(0);
}
int a = 0;
buf = malloc(sizeof(char*) * BUFF_SIZE);
for (a = 0; a < BUFF_SIZE; a++) {
  buf[a] = malloc(sizeof(char) * PAGE_SIZE);
}
//创建共享内存
shm_handle=shmget(键,BUFF_大小*页面大小,IPC_创建| 0644);
printf(“\n句柄是%d\n”,shm\u句柄);
//有效句柄?
如果(shm_句柄==-1){
printf(“共享内存创建失败\n”);
出口(0);
}
//附加到共享块,有关详细信息,请参见手册页
buf=(char**)shmat(shm_句柄,0,0);
如果(buf==(字符**)-1){
printf(“共享内存连接失败”);
出口(0);
}
int a=0;
buf=malloc(sizeof(char*)*BUFF_SIZE);
对于(a=0;a
以及消费者

// create shared memory
shm_handle = shmget(key, BUFF_SIZE * PAGE_SIZE, IPC_CREAT | 0644);
printf("handle is %d", shm_handle);
// valid handle?
if (shm_handle == -1) {
  printf("shared memory creation failed\n");
  exit(0);
}
char ** buft;
int a = 0;
// attach to shared block
buf = (char**) shmat(shm_handle, 0, 0);
if (buf == (char **) -1) {
  printf("Shared memory attach failed");
  exit(0);
}
buf = malloc(sizeof(char*) * BUFF_SIZE);
buft = malloc(sizeof(char*) * PAGE_SIZE);
for (a = 0; a < BUFF_SIZE; a++) {
  buf[a] = malloc(sizeof(char) * PAGE_SIZE);
  buft[a] = malloc(sizeof(char) * PAGE_SIZE);
}
printf("%s", buf[0]);
//创建共享内存
shm_handle=shmget(键,BUFF_大小*页面大小,IPC_创建| 0644);
printf(“句柄为%d”,shm_句柄);
//有效句柄?
如果(shm_句柄==-1){
printf(“共享内存创建失败\n”);
出口(0);
}
煤焦**buft;
int a=0;
//附加到共享块
buf=(char**)shmat(shm_句柄,0,0);
如果(buf==(字符**)-1){
printf(“共享内存连接失败”);
出口(0);
}
buf=malloc(sizeof(char*)*BUFF_SIZE);
buft=malloc(大小(字符*)*页面大小);
对于(a=0;a
您的代码没有将字符串放入共享内存中。它将它们放在堆上,就像malloc总是做的那样,因为您正在做:

buf = (char**) shmat(shm_handle, 0, 0);
...
/* now throw away the value of `buf` you got from shm */
buf = malloc(sizeof(char*) * BUFF_SIZE);
您需要做的是:

  • 不要使用堆在共享内存中分配所需的内容

  • 取而代之的是,为所有内容获取足够大的共享内存,然后逐个条目地将其复制到内存中,即手动将其放置在内存中


  • 在共享内存中分配内容很棘手,而且容易出错,因为共享内存的地址不一定在每个进程中都相同。除非您采取措施确保地址相同,否则无法在共享内存中存储指针,因为它们不会指向正确的位置--您需要将偏移量存储到共享内存中

    一旦您从
    shmat
    获得内存块,您需要自己管理该空间内的分配,跟踪正在使用和空闲的内存。在一般情况下,需要使用共享空间重新实现malloc/free,因为系统malloc/free总是使用非共享堆内存。这不是小事


    如果您只需要一些管理此功能的工作代码,您可以查看,但这不是一个简单的问题。

    我不认为您是这样做的。malloc不是正在破坏并覆盖您的共享内存地址吗?
    buf=(char**)shmat(…);buf=malloc(…)你正在扔掉shmat给你的东西,取而代之的是一个无聊的旧的非共享分配…我在连接到共享内存之前放了malloc,但它仍然是空的Mat说的!共享内存通常只是一个指针,而不是一个可以malloc和free的整体,除非您想自己编写所有这些内容。共享内存由shmat返回。在这种情况下,不得使用malloc。