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