我正在开发一个使用C语言实现的数据库服务器,它将处理来自多个客户端的请求。我使用 fork()
为各个客户端处理连接。
该服务器将数据存储在堆(heap)中,其中包括指向哈希表和动态分配记录的根指针。这些记录是具有指向各种数据类型的指针的结构体。我希望进程能够共享此数据,以便当客户端对堆进行更改时,更改将对其他客户端可见。
我了解到 fork()
使用 COW(写时复制),我的理解是当子进程尝试修改内存中的数据时,它会复制父进程的堆(和栈)内存。
我发现可以使用 shm 库来共享内存。
下面的代码是否是共享堆内存(在 shared_string 中)的有效方法?如果另一个子进程使用类似的代码(即从 //start 开始),那么该子进程在运行时和死亡后,其他子进程是否能够读/写它?
key_t key;
int shmid;
key = ftok("/tmp",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
//start
char * string;
string = malloc(sizeof(char) * 10);
strcpy(string, "a string");
char * shared_string;
shared_string = shmat(shmid, string, 0);
strcpy(shared_string, string);
以下是我对此的一些想法和关注点:
我在考虑共享数据库的根指针。我不确定这是否可行,或者是否需要将所有分配的内存标记为共享。
我不确定父级/其他子级是否能够访问由子级分配的内存。
我不确定子进程分配的内存在被杀死后是否仍留在堆上,或者是否会被释放。
fork()
,那么你需要使用共享内存(以某种形式)来处理公共数据,并确保非常小心地控制对该数据的访问。 - Jonathan Leffler