我正在使用结构体数组的共享内存,该结构体包含不同大厅的代码。 每个大厅都是一个不同的分叉(这就是使用共享内存的原因),并将自己的结构写入数组。 父分支应该能够查看和访问每个代码。
初始化shm
int fd = shm_open("tabLobby", O_CREAT | O_RDWR, S_IRWXU);
// Set the size of the shared memory object
int pageSize = sysconf(_SC_PAGE_SIZE);
CHECK(ftruncate(fd, pageSize), "__ftruncate__");
// Map the tabEtats object into the virtual address space of the calling process
tabLobby = mmap(0, pageSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
分叉并检索数据
int pidLobby;
tabLobby[nbLobby].pidLobby = 0;
CHECK(pidLobby = fork(), "fork()");
if(pidLobby == 0) {
// Child
serveurLobby(nbLobby);
exit(EXIT_SUCCESS);
} else {
// Father
while(tabLobby[nbLobby].pidLobby == 0) {
sleep(1);
}
// Show code and port
printf(GREEN "Création du Lobby %s (Port %d)\n" RESET, tabLobby[nbLobby].code, tabLobby[nbLobby].port);
// Writing response data
send_t sendData;
sendData.args[0] = tabLobby[nbLobby].ip;
sendData.args[1] = tabLobby[nbLobby].code;
char* portChar = malloc(sizeof(char) * 5);
sprintf(portChar, "%d", tabLobby[nbLobby].port);
sendData.args[2] = portChar;
}
子叉子
void serveurLobby(int idLobby) {
// Emplacement du lobby dans le tableau
tabLobby[idLobby].ip = ip;
tabLobby[idLobby].port = port;
char* code = malloc(sizeof(char) * 6);
// This functions generates a random code and puts it into code
generateLobbyCode(code);
strcpy(tabLobby[idLobby].code, code);
printf("Lobby code : %s\n", tabLobby[idLobby].code);
tabLobby[idLobby].pidLobby = getpid();
}
我看到的多件事:
tabLobby[idLobby].code = "TEST"
,有效tabLobby[idLobby].code
时,程序就会停止(没有错误或崩溃,只是普通的冻结)
tabLobby[idLobby].code[0] = 'a'
,使用strcpy、strdup...tabLobby[idLobby].code = code
而不是使用 strcpy 或其他方法时,一旦函数结束,信息就会丢失希望这个描述有帮助!
您可以与其他进程共享页面内存,但这并不意味着共享其他任何内容。如果您执行
malloc
,则分配的内存不会共享,因此其他进程将无法访问它。
所有内容都需要位于共享内存块内。您可能需要创建一些内存管理工具,以便可以在共享内存中分配和释放内存块。
或者,将
code
成员声明为固定大小的数组。然后,您可以直接复制到其中,但您必须限制复制的数量。
听起来你有
code
作为 char *
。这意味着,如果您尝试复制到它(使用 code[0]
或 strcpy
),您会得到未定义的行为(即很可能崩溃或冻结),因为您可能尚未将指针设置为任何内容。
如果将指针设置为
"literal string"
,则会出现一些未定义的行为。字符串的内存可能是共享的,具体取决于操作系统和编译器/链接器,但最有可能的是,其他进程无法读取该字符串。使用malloc
,肯定读不了。