Linux программирование в примерах | страница 93



работает с дескриптором открытого файла. (Обычным является соглашение по именованию пар системных вызовов >xxx() и >fxxxx(), работающих с именами файлов и дескрипторами файлов. Мы увидим несколько примеров в данной и последующих главах.) В обоих случаях аргумент >length является новым размером файла.

Этот системный вызов происходит от 4.2 BSD Unix, и на ранних системах мог использоваться лишь для сокращения длины файла, отсюда и название. (Он был создан, чтобы облегчить реализацию операции урезания в Фортране.) На современных системах, включая Linux, имя является неправильным, поскольку с помощью этих вызовов можно также увеличить, а не только сократить длину файла. (Однако, POSIX указывает, что возможность увеличения размера файла относится к расширению XSI.)

Для этих вызовов сокращаемый файл должен иметь разрешение на запись (для >truncate()), или должен быть открыт для записи (для >ftruncate()). Если файл сокращается, все данные после нового конца файла теряются. (Поэтому вы не можете сократить файл, снова удлинить его и найти там первоначальные данные.) Если файл-расширен, как в случае записи данных после >lseek(), данные между старым концом файла и новым концом файла читаются как нули.

Эти вызовы сильно отличаются от '>open(file, ... | O_TRUNC, mode)', который полностью урезает файл, отбрасывая все его данные. Эти же вызовы просто устанавливают абсолютную длину файла в данное значение.

Эти функции довольно специализированы; они используются лишь четыре раза во всем коде GNU Coreutils. Мы представляем пример использования >ftruncate() в разделе 5.5.3 «Изменение отметок времени: >utime()».

4.9. Резюме

• Когда системный вызов завершается неудачей, он обычно возвращает -1, а в глобальной переменной errno устанавливается предопределенное значение, указывающее на проблему. Для сообщений об ошибках могут использоваться функции >perror() и >strerror().

• Доступ к файлам осуществляется через небольшие целые, которые называются дескрипторами. Дескрипторы файлов для стандартного ввода, стандартного вывода и стандартной ошибки наследуются от родительского процесса программы. Другие получаются через >open() или >creat(). Для их закрытия используется >close(), a >getdtablesize() возвращает разрешенное максимальное число открытых файлов. Значение >umask (устанавливаемое с помощью >umask()) влияет на права доступа, получаемые новыми файлами при создании с помощью >creat() или с флагом >O_CREAT