Получить поведение копирования (при записи) для fork () ing без fork ()

У меня большой буфер:

char *buf = malloc(1000000000); // 1GB

Если бы я разветвлял новый процесс, у него был бы buf, который разделял бы память с родительским buf, пока один или другой не записал в него. Даже в этом случае ядро должно было бы выделить только один новый блок размером 4 КБ, а остальные будут продолжать использоваться совместно.

Я хотел бы сделать копию buf, но я собираюсь изменить только небольшую часть копии. Я бы хотел, чтобы поведение при копировании при записи не было разветвленным. (Как вы получаете бесплатно при разветвлении.)

Это возможно?

 fadedbee12 июн. 2012 г., 17:16
Да, это дурак.
 fadedbee12 июн. 2012 г., 16:45
Да, я хочу "бесплатно". Мне было интересно, есть ли какие-нибудь решения на основе mmap или что-то, чего я даже не представлял.
 ugoren12 июн. 2012 г., 17:05
возможный дубликатCan I do a copy-on-write memcpy in Linux?
 Marc B12 июн. 2012 г., 16:41
конечно, но это не будет "бесплатно"; - вам придется самостоятельно управлять памятью и следить за изменениями.
 fadedbee12 июн. 2012 г., 16:48
Возможно, mmap с MAP_ANONYMOUS и MAP_PRIVATE сделают эту работу?

Ответы на вопрос(1)

Решение Вопроса

shm_open) для блока. В первый раз сопоставьте это сMAP_SHARED, Когда вы будете готовы сделать копию и переключиться на COW, позвонитеmmap снова сMAP_FIXED а такжеMAP_PRIVATE нанести на карту поверх исходной карты иMAP_PRIVATE сделать второй экземпляр. Это должно получить вам эффекты, которые вы хотите.

 fadedbee13 июн. 2012 г., 17:26
Спасибо, я добавил ftruncate и теперь имею ошибку сегмента вместо ошибки шины, все еще в строке 14.
 fadedbee13 июн. 2012 г., 17:59
Оно работает!gist.github.com/2924412  Какова была цель закомментированного переназначения buf? Кажется, мне это не нужно. Большое спасибо.
 13 июн. 2012 г., 17:16
Тебе нужноftruncate дать сегменту разделяемой памяти размер. Начальный размер равен нулю.
 13 июн. 2012 г., 17:30
Я подозреваю, что сбой на самом деле в строке 17, где вы пишете в буфер. Ваши отладочные printf'ы бесполезны, потому что вы не сбрасываете вывод, и они даже не заканчиваются\n..
 fadedbee13 июн. 2012 г., 16:29
Это выглядит очень обнадеживающе, но я не могу заставить его работать. Я получаю ошибку автобуса (на линии 13). fd == 3. Не могли бы вы указать на мою глупую ошибку?gist.github.com/2924412

Ваш ответ на вопрос