gpt4 book ai didi

c - 每个客户端服务器一个进程在 C 中使用共享内存

转载 作者:可可西里 更新时间:2023-11-01 02:53:41 24 4
gpt4 key购买 nike

出于学术目的,我正在使用 TCP 协议(protocol)创建一个“每个客户端一个进程” 服务器。

我使用如下所示的全局结构:

struct keyvalue
{
char a[4096];
char b[4096];
}data[1000];

我使用 fork() 为每个客户创建一个 child 。

我知道每个 child 都将此结构视为父进程的精确副本,但是如果一个 child 进行了更改,其他 child 将看不到它,这就是我的目标。

我在谷歌中搜索了几个小时,我找到的唯一合适的解决方案是 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);
.
.
.
}

谢谢你的表现,抱歉我的英语不好。

最佳答案

您可以使用以下代码创建一个在多个 fork 进程之间共享的结构数组。

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define MAX_LEN 10000

struct region {
int len;
char buf[MAX_LEN];

};

int fd;

int main(void){

//Create shared memory
fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1)
printf("Error: shm_open\n");

//Expand to meet the desirable size
if (ftruncate(fd, MAX_LEN*sizeof(struct region)) == -1)
printf("Error: ftruncate\n");



pid_t pid = fork();
if (pid == 0){
struct region * ptr = mmap(NULL, MAX_LEN*sizeof(struct region), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
printf("Error\n");


memset(ptr, 0, 50*sizeof(struct region));
usleep(1500000);
ptr[33].len = 42;

}else if (pid > 0){
struct region * ptr = mmap(NULL, MAX_LEN*sizeof(struct region), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
printf("Error\n");


usleep(1000000);
printf("Value before: %d\n", ptr[33].len);
usleep(1000000);
printf("Value after: %d\n", ptr[33].len);

}else{
printf("Error: fork\n");
}

shm_unlink("/myregion");

return 0;
}

编译:gcc -o shmem_test shmem_test.c -lrt

编辑:如果您不能使用 shm_open,或者您可以在主函数中执行以下操作:

int main(void){

struct region * ptr = mmap(NULL, MAX_LEN*sizeof(struct region), PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED,-1,0);
pid_t pid = fork();
if (pid == 0){

usleep(1500000);
ptr[33].len = 42;

}else if (pid > 0){

usleep(1000000);
printf("Value before: %d\n", ptr[33].len);
usleep(1000000);
printf("Value after: %d\n", ptr[33].len);

}else{
printf("Error: fork\n");
}

return 0;
}

两者之间的区别在于,shm_open 创建了一个命名共享内存,这意味着不同可执行文件中的不同进程可以映射此内存,前提是它们具有结构区域定义。在第二种情况下,这是无法做到的,即共享内存是匿名的。

关于c - 每个客户端服务器一个进程在 C 中使用共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43609835/

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