gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:50:02 25 4
gpt4 key购买 nike

我已经用 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 信号量)通常会造成死锁。

关于c - 如何处理共享内存中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49217802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com