Главная » 2016 » Март » 28 » Ограничения 0VERFL0W
12:09
Ограничения 0VERFL0W
Максимальное значение позиции в файле ограничивается размером типа o f f t.Большинство машинных архитектур определяют его как тип С long, размер которогов Linux всегда равен одному слову (обычно это размер регистров общегоназначения машины). Внутри, однако, ядро хранит смещения, используя тип Сlong. Это не создает никаких проблем на 64-разрядных машинах, но означает,что на 32-разрядных машинах при выполнении относительных операций поискамогут возникать ошибки E0VERFL0W.Значения ошибокВ случае успеха оба вызова возвращают число считанных или записанных байтов.Если pread() возвращает значение 0, то это указывает на условие EOF; еслиpwriteO возвращает значение 0, то этот вызов ничего не записал в файл. В случаеошибки оба вызова возвращают значение -1 и соответствующим образомустанавливают переменную еггпо. Вызов preadO может устанавливать любыезначения еггпо, допустимые для вызовов read() и lseekO. Вызов pwr ite( ) можетустанавливать любые значения, допустимые для wr ite ( ) и lseekO.Усечение _________файловLinux предоставляет два системных вызова, предназначенные для усеченияфайлов. Оба они определяются в разнообразных стандартах POSIX и являютсяв них обязательными (до той или иной степени). Определения этих вызовов:#include <unistd.h>#include <sys/types.h>int ftruncate (int fd. off_t Ten):иfinclude <un1std.h>finclude <sys/types.h>int truncate (const char *path, off t len);Оба системных вызова усекают указанный файл до длины len. Системныйвызов ftruncateO работает на дескрипторе файла, который передается припомощи аргумента fd, и этот дескриптор должен быть открытым для записи.Системный вызов truncateO работает на имени файла, который передаетсяв аргументе path, и указанный файл должен быть доступным для записи. Обавызова в случае успеха возвращают значение 0. Если происходит ошибка, тоони возвращают значение -1 и соответствующим образом устанавливают переменнуюеггпо.Чаще всего эти системные вызовы применяются для уменьшения длиныфайла. В случае успеха новая длина файла становится равной значению, котороесодержится в аргументе 1 еп. Данные, находившиеся между новым и старымконцом файла, удаляются, и к ним больше нельзя обратиться при помощи запросана чтение.Эти функции также можно использовать для ?усечения? файлов до длины,превышающей их первоначальный размер, — примерно то же самое делает комбинацияпоиска и записи, описанная ранее в разделе ?Поиск за пределами концафайла?. Добавленные байты заполняются нулями.Ни одна из этих операций не обновляет текущую позицию в файле.Например, у нас есть файл pirate.txt длиной 74 байт со следующим содержимым:Edward Teach was a notorious English pirate.He was nicknamed Blackbeard.В том же каталоге, где находится этот файл, выполним следующую программу:finclude <umstd.h>finclude <stdio.h>int main( ){int ret;ret = truncate ("./pirate.txt", 45):i f (ret — -1) {perror ("truncate"):return -1:}return 0.}В результате мы получим файл длиной 45 байт с таким содержимым:Edward Teach was a notorious English pirate.
Просмотров: 48 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar