繁体   English   中英

如何处理共享内存中的结构

[英]How to handle structs in Shared memory

我已经在C语言中创建了一个结构。现在,我想在该结构中写入一些数据,并希望其他进程读取它。 假设作者为服务器,读者为客户端。

对于编写者而言,代码如下:

typedef struct 
{
    pthread_mutex_t mutex;
    char * data;

} shm_data_struct, *shm_data_struct_t;
int shmid;
char * shm_address;
shm_data_struct_t shm_ptr;


int main(int argc, char const *argv[])
{
    shmid = shmget(KEY, sizeof(shm_data_struct), IPC_CREAT | 0666)
    shm_address = shmat(shmid, (void*)0, 0)
    shm_ptr = (shm_data_struct_t)shm_address;
    //Writing into struct
    shm_ptr->data = "String";
    while(shm_ptr->data != '*'){
        sleep(1);
    }
}

对于客户端:

typedef struct 
{
    pthread_mutex_t mutex;
    char * data;

} shm_data_struct, *shm_data_struct_t;

int main(int argc, char const *argv[])
{
    int shmid;
    key_t key;
    char *shm;
    shm_data_struct_t shm_ptr;
    key = 120;
    shmid = shmget(key, sizeof(shm_data_struct), 0666)
    shm = shmat(shmid, NULL, 0)

    /*
     * Now read what the server put in the memory.
     */
    shm_ptr = (shm_data_struct_t)shm;
    printf("%s\n", shm_ptr->data);
    shm_ptr->data = '*';

    exit(0);
}

此代码使我在客户代码的打印语句中出现分段错误。 有人可以帮我做错什么吗?

这是你的问题:

    char * data;

仅指针(即地址)被存储在共享内存中。 指针所指向的数据不会共享,并且指针本身将在另一个进程中无效或指向意外数据。

一般来说,SysV共享内存是IPC的较差形式,通常应避免使用。 正如您所发现的,它甚至不能轻易存储中等复杂的数据结构。 它也很容易出现争用情况,并且如果避免使用这种锁定结构(例如SysV信号),则使用它们的进程崩溃时通常会创建死锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM