Я могу сделать копию на записи memcpy в Linux?

Причина они не открытый исходный код, то, потому что, как Kent упомянул, это не поможет. Вы могли открытый исходный код код. Но нет никакого способа гарантировать, что машина для подсчета голосов, которую Вы используете, на самом деле выполняет код, который является открыт полученный.

24
задан Chris Jefferson 14 October 2009 в 09:21
поделиться

5 ответов

Ваш лучший шанс - это, вероятно, mmap () исходные данные в файл, а затем mmap () тот же файл снова, используя MAP_PRIVATE .

17
ответ дан 29 November 2019 в 00:12
поделиться

В зависимости от того, что именно вы копируете, постоянная структура данных может быть решением вашей проблемы.

4
ответ дан 29 November 2019 в 00:12
поделиться

У вас должна быть возможность открыть свою собственную память через / proc / $ PID / mem, а затем mmap () интересную ее часть с MAP_PRIVATE в другое место.

1
ответ дан 29 November 2019 в 00:12
поделиться

На объектно-ориентированном языке проще реализовать копирование при записи , как и c ++. Например, большинство контейнерных классов в Qt копируются при записи.

Но если вы, конечно, можете сделать это и в C, это просто еще немного работы. Когда вы хотите назначить свои данные новому блоку данных, вы не делаете копию, вместо этого вы просто копируете указатель в оболочке strcut вокруг ваших данных. Вам необходимо отслеживать в своих блоках данных статус данных. Если вы сейчас что-то измените в своем новом блоке данных, вы сделаете «настоящую» копию и измените статус. Вы, конечно, больше не можете использовать для присваивания простые операторы, такие как "=", вместо этого вам нужны функции (в C ++ вы просто выполняете перегрузку операторов).

Более надежная реализация должна использовать счетчики ссылок вместо простых flag, оставляю это на ваше усмотрение.

Быстрый и грязный пример: Если у вас есть

struct big {
//lots of data
    int data[BIG_NUMBER];
}

, вы должны сами реализовать присваивающие функции и геттеры / сеттеры.

// assume you want to implent cow for a struct big of some kind
// now instead of
struct big a, b;
a = b;
a.data[12345] = 6789;

// you need to use
struct cow_big a,b;
assign(&a, b);   //only pointers get copied
set_some_data(a, 12345, 6789); // now the stuff gets really copied


//the basic implementation could look like 
struct cow_big {
    struct big *data;
    int needs_copy;
}

// shallow copy, only sets a pointer. 
void assign(struct cow_big* dst, struct cow_big src) {
    dst->data = src.data;
    dst->needs_copy = true;
}

// change some data in struct big. if it hasn't made a deep copy yet, do it here.
void set_some_data(struct cow_big* dst, int index, int data } {
    if (dst->needs_copy) {
        struct big* src = dst->data;
        dst->data = malloc(sizeof(big));
        *(dst->data) = src->data;   // now here is the deep copy
       dst->needs_copy = false;
   }
   dst->data[index] = data;
}

Вам также необходимо написать конструкторы и деструкторы. Я действительно рекомендую для этого C ++.

2
ответ дан 29 November 2019 в 00:12
поделиться

Механизм копирования при записи, используемый, например, fork (), является функцией MMU (блок управления памятью), который обрабатывает память подкачка для ядра. Доступ к MMU является привилегированной операцией, то есть не может быть выполнен приложением пользовательского пространства. Я также не знаю ни одного API копирования при записи, экспортируемого в пространство пользователя.

(Опять же, я не совсем гуру Linux API, так что другие могут указать на соответствующие вызовы API, которые я пропустил.)

Изменить: И вот, MSalters оказывается на высоте. ; -)

2
ответ дан 29 November 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: