Совместное использование памяти кучи с помощью fork()

Я работаю над реализацией сервера базы данных на 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);

8
задан phantombit 1 April 2012 в 04:17
поделиться