pha*_*bit 8 c c++ heap fork shared-memory
我正在使用C实现一个数据库服务器,它将处理来自多个客户端的请求.为此,我使用fork()来处理各个客户端的连接.
服务器将数据存储在堆中,该数据包含一个指向动态分配记录的哈希表的根指针.记录是具有指向各种数据类型的指针的结构.我希望这些进程能够共享这些数据,以便当客户端对堆进行更改时,其他客户端将看到更改.
我已经知道fork()使用COW(Copy On Write),我的理解是,当子进程尝试修改内存中的数据时,它将复制父进程的堆(和堆栈)内存.
我发现我可以使用shm库来共享内存.
- 是否足以共享数据库的根指针或是否必须将所有已分配的内存分享?
- 如果孩子分配内存,父/其他孩子能够访问它吗?
- 如果一个孩子分配内存并且后来被杀死,分配的内存是否仍然留在堆上?
那么例如下面的代码是否是共享堆内存的有效方式(在shared_string中)?如果一个孩子使用类似的代码(即从//开始),其他孩子是否能够在孩子跑步和死亡之后读/写?
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);
Run Code Online (Sandbox Code Playgroud)
首先,fork这完全不适合您想要实现的目标。即使你能让它工作,这也是一个可怕的黑客行为。一般来说,fork无论如何,只适用于非常简单的程序,我什至会说,fork除非紧随其后exec,否则永远不应该使用 ,但这不是这里的重点。你真的应该使用线程。
话虽如此,要在 后在父级和子级之间共享内存,并且fork相同的指针在两者中都有效,唯一的方法是在. 之后您无法像这样创建新的共享内存,因为不能保证它将映射到两者中的相同地址范围。mmapshmatMAP_SHAREDforkfork
只是不要使用fork。这不是适合这项工作的工具。
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |