#c #linux #mmap
#c #linux #mmap
Вопрос:
Контекст :
Работа с текстовым файлом. Linux, debian 64 бит. C99-C11
Необходимо :
Отслеживайте открытые индексы этого файла. Например :
Я открываю индекс 65, затем 235, затем 12, затем 1024, чтобы прочитать письмо. Я хотел бы иметь возможность отслеживать такие индексы, как [12,65,235,1024].
Я читал, что ядро сохраняет структуру, но..
Отсутствие массива malloc’d в коде для отслеживания является ограничением.
Почему ? чтобы увидеть, насколько это возможно / неосуществимо.
Система (очевидно?) для меня уже есть трек, верно?
Вопрос :
Может ли ядро помочь мне отслеживать открытые индексы файла mmap’d (и, если возможно, в отсортированном виде), чтобы избежать индекса malloc’d в коде?
Редактировать:
Это не индексный файл. Это простой текстовый файл с некоторым текстом в нем. Я хочу отслеживать доступные байты, и я не хочу использовать для этого массив, если ядро уже знает, какие байты были загружены / доступны.
Комментарии:
1. Являются ли эти индексы файлами? Вы говорите о записях в файле? Если вы используете mmap, ядро не принесет вам много пользы, если данные, которые вы индексируете, не соответствуют размеру страниц, которые использует mmap, что, вероятно, составляет 4k.
2. Я обновляю вопрос, чтобы прояснить его 🙂
Ответ №1:
При обсуждении «отслеживания» чего-либо важным вопросом является «Что такое первичный ключ?» /»Как вы собираетесь получить к нему доступ?».
Ядру нужно только знать, что «адрес A имеет отображение файла X, смещение Y, длина Z». Ему не нужно тратить ресурсы на знание того, где сопоставлен файл X. Скорее всего, единственный способ, которым ядро узнает, что файл сопоставлен в любом месте, — это счетчик ссылок, который кто-то использует этот файл, вероятно, он даже не знает, являются ли они mmap: s или просто открытыми файловыми дескрипторами.
Фактически, когда файл принудительно аннулируется (например, при размонтировании), это реализуется путем простой замены объекта file на недопустимый объект file, а не отслеживания сопоставлений и их уничтожения (это информация 10-летней давности в Linux, с тех пор она могла измениться, я просто точно знаюдругие операционные системы все еще работают так).
Итак, чтобы ответить на ваш вопрос: ядро, вероятно, не заботится о том, чтобы знать, что вам нужно знать. Вам нужно сделать это самостоятельно. Особенно, если вы вообще хотите быть переносимым.
Комментарии:
1. Итак, при запросе виртуальной памяти для mmap файла нет способа узнать, какая часть файла лениво загружается в ОЗУ?
2. Начнем с того, что нет способа запросить ядро (если вы не разбираете вещи в /proc , но это слишком медленно для любого практического использования). Я хочу сказать, что даже если бы был способ, ядро знает только «что отображается по этому адресу», а не «какой адрес отображает эту часть».