我正在努力用 C 语言实现一个数据库服务器,它将处理来自多个客户端的请求。我在用fork()
处理单个客户端的连接。
服务器将数据存储在堆中,堆由指向动态分配记录的哈希表的根指针组成。记录是具有指向各种数据类型的指针的结构。我希望进程能够共享这些数据,以便当客户端对堆进行更改时,其他客户端可以看到这些更改。
我了解到fork()
uses COW(写入时复制) http://en.wikipedia.org/wiki/Copy-on-write,我的理解是,当子进程尝试修改内存中的数据时,它会复制父进程的堆(和堆栈)内存。
我发现我可以使用 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
完全不适合您想要实现的目标。即使你能让它工作,这也是一个可怕的黑客行为。一般来说,fork
无论如何,只适用于非常简单的程序,我什至可以说fork
除非紧随其后,否则永远不要使用exec
,但这不是这里的重点。你确实应该使用线程。
话虽如此,在父母和孩子之间共享记忆的唯一方法是fork
,并且相同的指针在两者中都有效的情况下,是mmap
(or shmat
,但这更加模糊)一个文件或匿名地图MAP_SHARED
在...之前fork
。之后您不能像这样创建新的共享内存fork
因为不能保证它将被映射到两者中的相同地址范围。
只是不要使用fork
。这不是适合这项工作的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)