Я работаю над реализацией сервера базы данных на C, который будет обрабатывать запросы от нескольких клиентов. Для этого я использую fork() для обработки соединений для отдельных клиентов.
Сервер хранит данные в куче, которая состоит из корневого указателя на хеш-таблицы динамически размещаемых записей. Записи представляют собой структуры, содержащие указатели на различные типы данных. Я хотел бы, чтобы процессы могли обмениваться этими данными, чтобы, когда клиент вносит изменения в кучу, изменения были видны другим клиентам.
Я узнал, что fork() использует COW (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);