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

时间:2018-03-11 07:46:46

标签: c ipc 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);
}

此代码在客户端代码的print语句中给出了段错误。任何人都可以帮助我做错了吗?

1 个答案:

答案 0 :(得分:1)

这是你的问题:

    char * data;

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

一般来说,SysV共享内存是一种不良的IPC形式,通常应该避免使用。正如您所发现的那样,即使是中等复杂的数据结构也无法轻松存储;它也容易出现竞争条件,用于避免这种情况的锁定结构(即SysV信号量)通常会在使用它们的进程崩溃时产生死锁。