gpt4 book ai didi

c - C 中 "On demand"服务器中的共享内存结构

转载 作者:可可西里 更新时间:2023-11-01 02:50:39 27 4
gpt4 key购买 nike

出于学术目的,我必须创建一个基于 TCP 协议(protocol)的 “按需服务器”。客户端每次发送一个 KEY 和一个 VALUE,我必须将它们存储在 global 结构中,如下所示:

我使用名为“put”的函数将每个 KEY 和 VALUE 存储到结构中,并使用“get”函数使用键并找到正确的值:

我的问题是,如果一个客户对结构进行了更改,下一个客户将无法知道。我使用信号量以使服务器等到 child 完成后再接受下一个 child ,但我仍然遇到同样的问题。

我读到我必须共享这个结构的内存才能使用 mmap 进行这项工作,但我仍然找不到合适的解决方案。

我在服务器编程方面迈出了第一步,每个帮助都会很棒。

最佳答案

我的问题是,如果客户端更改了结构,下一个客户端将无法知道。

如您所述,mmap() 是解决方案的一部分...
您的应用程序的共享内存需求可以通过 _ shm_open() 来解决_, _ shm_unlink() _, mmap 等,如 this 中所示 帖子。和 here 有关共享内存的其他示例

链接中总结了所有要点,但这段摘录描述了基本概念:

shm_open() creates and opens a new, or opens an existing, POSIX shared memory object. A POSIX shared memory object is in effect a handle which can be used by unrelated processes to mmap(2) the same region of shared memory. The shm_unlink() function performs the converse operation, removing an object previously created by shm_open().

我还想建议内存的动态分配可用于根据需要为您的 struct 创建空间。如图所示,成员的大小过大,

char keys[4096];
char values[4096];

但在评论中您声明它们只需要 51 个字节。然后可以将结构创建为 typedef:

struct keyvalue {
char keys[51];
char values[51];
} DATA;

创建指向您的结构的指针的实例:

DATA *pData = {0};

然后可以根据需要使用标准 malloc 调整大小 和或 realloc

pData = malloc(initialSize*sizeof(DATA));

随着大小要求的变化,使用以下方法增加内存:

DATA *tmp = {0};
tmp = realloc(pData, newSize);
if(!tmp) return -1;//ensure memory allocation successful
pData = tmp;//tmp includes previous contents of pData, and more space
... //continue using pData

在不再需要时释放 pData。

free(pData);

要在函数中传递此结构,函数可能如下所示:

void func1(DATA *d, int numElements)
{
...
for(i=0;i<numElements;i++)
{
strcpy(d[i]->keys, "some key");
strcpy(d[i]->values, "some value");
}
...
}

使用 pData 的副本调用该函数,假设它有 1000 个元素:

func1(pData, 1000);

关于c - C 中 "On demand"服务器中的共享内存结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658665/

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