У меня есть программное обеспечение (C/C++/Linux), состоящее из трех сервисов, использующее файл tmpfs в качестве общей памяти. Мы ftruncate увеличиваем размер файла до 1 ГБ для удобства, но на практике файл будет содержать не более 500 МБ данных, и, следовательно, более 50% файла представляет собой большую заполненную нулями дыру в конце.
Программное обеспечение предлагает инструмент под названием download, позволяющий пользователю получить собственную автономную копию файла. При выполнении этой копии я не хочу, чтобы пользователь видел, что она занимает 1 ГБ, а вместо этого удалите «конечную дыру». Нам не нужно постоянно отслеживать «фактический размер», и я предпочитаю узнавать или «выводить» размер только тогда, когда пользователь просит его загрузить, что является довольно необычной операцией. Я хочу, чтобы система помогла мне это выяснить.
Мне достаточно любого из следующих подходов:
system("blabla") и я предпочитаю вызывать функции C.Как мне это сделать? Я предпочитаю использовать системные вызовы или libc, а если нет удобного способа сделать это, то в качестве альтернативы использую инструменты командной строки. Использование сторонних библиотек C/C++ недопустимо.
@AndrewHenle Если я сделаю это по наивности, не будет ли чтение файла в «незаписанных зонах» провоцировать выделение страниц? Исходный файл находится в оперативной памяти, поэтому я не хочу, чтобы «чтение всего файла» приводило к тому, что ядро случайно выделяло для него страницы.
В зависимости от конструкции вашего кода, если вы знаете, сколько байтов данных было записано после завершения обработки файла, вам не нужно будет делать это наивно. Вот почему я спросил, можете ли вы это сделать.
Когда вы говорите «пишите», что вы имеете в виду? О каком письме вы думаете? Вызов write из моих данных в пользовательский файл, а затем проверка, сколько байт было записано, вернулось? Или что?





Вы можете исследовать дыры в файле с помощью последовательности lseek с флагами SEEK_HOLE и SEEK_DATA, которые приводят вас к следующей дыре/не-дыре.
Эти флаги доступны в Linux 3.1+, а также в некоторых BSD.
Можете ли вы
ftruncate()уменьшить размер файла до объема данных, которые были записаны в него, когда вы закончите его создание?