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
C:将带字符串的结构复制到共享内存_C_Struct_Shared Memory - Fatal编程技术网

C:将带字符串的结构复制到共享内存

C:将带字符串的结构复制到共享内存,c,struct,shared-memory,C,Struct,Shared Memory,我在一个使用forking的服务器上工作,它在共享内存中存储字符串的映射(k->v)。我想做得非常简单,但我在指针和我需要复制的东西上迷失了方向。因此,我提取了相关代码,如下所示: struct key_value { char key[32]; char value[32]; }; struct key_value **map; int *map_size; int shmid = shmget(IPC_PRIVATE, sizeof(struct key_value**)

我在一个使用forking的服务器上工作,它在共享内存中存储字符串的映射(k->v)。我想做得非常简单,但我在指针和我需要复制的东西上迷失了方向。因此,我提取了相关代码,如下所示:

struct key_value {
    char key[32];
    char value[32];
};

struct key_value **map;
int *map_size;

int shmid = shmget(IPC_PRIVATE, sizeof(struct key_value**), 0600);
map = (struct key_value**) shmat(shmid, 0, 0);
int shmid_size = shmget(IPC_PRIVATE, sizeof(int), 0600);
map_size = (int*) shmat(shmid_size, 0, 0);
*map_size = 0;
//the above happens before fork()

char *c = "abc";

int shmid_struct = shmget(IPC_PRIVATE, sizeof(struct key_value*), 0600);
struct key_value *entry = (struct key_value*) shmat(shmid_struct, 0, 0);
*entry->key = *c;

printf("%s\n", map[0]->key);

//smhdt's & shmctl's
因此,我想要的是将字符串
“abc”
*c
复制到
映射中,从而复制到共享内存中。显然,我还没有完全理解指针和结构,所以我希望有人能把它弄清楚。我现在得到了一个segfault“在主要的某处”(谢谢gdb…)

请注意,我现在还可以使用固定的max_大小的地图(不过如果是动态的,那就太好了)


编辑:有人在回答中指出,在结构中使用
char*
是困难的,因此使用char[x]。已更新代码以反映这一点,但仍不起作用。

包含指针的结构无法安全地存储在共享内存中,因为指针在创建它们的进程之外没有任何意义。即使共享内存区域在每个进程中映射到同一地址(如果内存在
fork()
之前映射,则为true,但在其他情况下可能为false),指向非共享内存的指针也不会正常工作,因为每个进程在该地址处可能有不同的数据

如果要在共享内存中存储字符串,则需要将其存储为显式字符数组,例如

struct key_value {
    char key[32];
    char value[32];
};
或者使用另一种方案,例如将偏移量存储到共享内存区域中的字符串表中


不过,一般来说,共享内存不是进程间通信的好工具。如果您的应用程序依赖于能够在内存中共享数据,那么线程可能是一种更好的方法。

包含指针的结构无法安全地存储在共享内存中,因为指针在创建它们的进程之外毫无意义。即使共享内存区域在每个进程中映射到同一地址(如果内存在
fork()
之前映射,则为true,但在其他情况下可能为false),指向非共享内存的指针也不会正常工作,因为每个进程在该地址处可能有不同的数据

如果要在共享内存中存储字符串,则需要将其存储为显式字符数组,例如

struct key_value {
    char key[32];
    char value[32];
};
或者使用另一种方案,例如将偏移量存储到共享内存区域中的字符串表中


不过,一般来说,共享内存不是进程间通信的好工具。如果应用程序依赖于在内存中共享数据,线程可能是一种更好的方法。

不要这样做。。。。阅读更多,尤其是你最近的编辑完全改变了问题。这毫无意义。住手,别那么做。。。。阅读更多,尤其是你最近的编辑完全改变了问题。这毫无意义。停止它。我的任务正如我提到的:在服务器上的进程之间共享一个映射(k->v)。您认为有比使用共享内存更简单的解决方案吗?我不能把东西储存在文件里。此外,您能否提供一个在结构中使用键[32]的小型工作示例?只有更改为[32]并不能使我的代码正常工作,因此我仍然需要了解到底需要复制什么以及如何复制。我的任务如我所述:在服务器上的进程之间共享映射(k->v)。您认为有比使用共享内存更简单的解决方案吗?我不能把东西储存在文件里。此外,您能否提供一个在结构中使用键[32]的小型工作示例?仅更改为[32]并不能使我的代码正常工作,因此我仍然需要了解到底需要复制什么以及如何复制。