Обратный звонок при доступе к памяти? - PullRequest
5 голосов
/ 02 июня 2011

Существует ли способ выделить некоторую память и иметь какой-то обратный вызов (будь то указатель на функцию или сигнал) при обращении к памяти (либо к чтению, либо к записи)?

Например, если бы я сказал выделить 1 Мб памяти, я хотел бы иметь возможность вызывать функцию при обращении к любому из этих 1 Мб.C ++.

Ответы [ 4 ]

7 голосов
/ 02 июня 2011

Да, есть.

Используйте системный вызов mprotect (2) (см .: http://linux.die.net/man/2/mprotect), чтобы установить защиту страницы только для чтения или отсутствие доступа к памяти на странице и установить обработчик сигнала SIGEGV, который будет вызываться при обращении к памяти.

Обратите внимание, что вам нужно будет использовать mprotect в вашем обработчике сигналов, чтобы фактически разрешить доступ к памяти после вызова вашего обработчика сигналов и когда вы открываете окно для чего-либо еще, чтобы получить доступ к памяти без вашего ведома, например, из другая тема. Это может или не может быть проблемой в зависимости от вашего конкретного использования.

3 голосов
/ 02 июня 2011

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

Что-то в этих строках:

// based on pretty standard auto_ptr
template <class T> class auto_ptr
{
    T* ptr;
public:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    ~auto_ptr()                 {delete ptr;}
    T& operator*()              {return *ptr;}   // <<--- add your stuff here
    T* operator->()             {return ptr;} // <<--- and here
    // .
};
1 голос
/ 02 июня 2011

Я не думаю, что существует такой API для этого, пока вы не создадите объект-оболочку вокруг выделенной памяти, а затем доступ к памяти будет сделан через этот объект-оболочку.Тогда этот объект-обертка сможет видеть весь доступ к основной памяти.

0 голосов
/ 02 июня 2011

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

Если вы хотите, чтобы многое происходило, а затем программа прервалась и отреагировала на то, что это распределение было подделано, установите логическое значение, а при изменении значения логическое значение перейдет в значение true и отправьте функцию для проверки этого логического значения .

...