【发布时间】:2017-09-22 10:02:46
【问题描述】:
出于学术目的,我正在使用 TCP 协议创建一个“每个客户端一个进程”服务器。
我使用如下所示的全局结构:
struct keyvalue
{
char a[4096];
char b[4096];
}data[1000];
我使用 fork() 为每个客户创建一个孩子。
我知道每个孩子都将此结构视为父进程的精确副本,但是如果一个孩子进行了更改,其他孩子将看不到它,这是我的目标。
我在谷歌搜索了几个小时,我发现唯一合适的解决方案是 mmap()
下面我将介绍我如何尝试解决此任务:
int main ( int argc, char *argv[])
{
for(int c = 0; c < 1000 ; c++)
{
data[c] = mmap(NULL, sizeof(data[c]), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
}
.
.
.
return 0;
}
但是我认为我没有正确理解这个函数的使用,并且文档对这个项目没有帮助。
如果有人向我解释在我的项目中使用此功能的确切方法,那就太好了。 编辑:
这个全局结构被两个全局函数使用:
void put(char *key, char *value)
{
.
.
.
strcpy(data[lp].keys,key);
strcpy(data[lp].values,value);
.
.
.
}
谢谢你的表现,对不起我的英语不好。
【问题讨论】:
-
这个结构数组应该对所有进程可见?你会考虑使用 pthreads 吗?
-
@k_kaz 是的,它应该对所有进程都可见。因为它是一个服务器,所以每个进程(客户端)都必须有权访问这个结构。我不能使用 pthreads,因为它是出于学术目的并且说明很严格。