修改共享内存中的值会停止程序

问题描述 投票:0回答:1

我正在使用结构体数组的共享内存,该结构体包含不同大厅的代码。 每个大厅都是一个不同的分叉(这就是使用共享内存的原因),并将自己的结构写入数组。 父分支应该能够查看和访问每个代码。

初始化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 或其他方法时,一旦函数结束,信息就会丢失

希望这个描述有帮助!

c shared-memory
1个回答
0
投票

您可以与其他进程共享页面内存,但这并不意味着共享其他任何内容。如果您执行

malloc
,则分配的内存不会共享,因此其他进程将无法访问它。

所有内容都需要位于共享内存块内。您可能需要创建一些内存管理工具,以便可以在共享内存中分配和释放内存块。

或者,将

code
成员声明为固定大小的数组。然后,您可以直接复制到其中,但您必须限制复制的数量。

听起来你有

code
作为
char *
。这意味着,如果您尝试复制到它(使用
code[0]
strcpy
),您会得到未定义的行为(即很可能崩溃或冻结),因为您可能尚未将指针设置为任何内容。

如果将指针设置为

"literal string"
,则会出现一些未定义的行为。字符串的内存可能是共享的,具体取决于操作系统和编译器/链接器,但最有可能的是,其他进程无法读取该字符串。使用
malloc
,肯定读不了。

© www.soinside.com 2019 - 2024. All rights reserved.