- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
出于学术目的,我必须创建一个基于 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/
我是一名优秀的程序员,十分优秀!