Книга: Linux программирование в примерах
4.9. Резюме
4.9. Резюме
• Когда системный вызов завершается неудачей, он обычно возвращает -1, а в глобальной переменной errno устанавливается предопределенное значение, указывающее на проблему. Для сообщений об ошибках могут использоваться функции perror()
и strerror()
.
• Доступ к файлам осуществляется через небольшие целые, которые называются дескрипторами. Дескрипторы файлов для стандартного ввода, стандартного вывода и стандартной ошибки наследуются от родительского процесса программы. Другие получаются через open()
или creat()
. Для их закрытия используется close()
, a getdtablesize()
возвращает разрешенное максимальное число открытых файлов. Значение umask
(устанавливаемое с помощью umask()
) влияет на права доступа, получаемые новыми файлами при создании с помощью creat()
или с флагом O_CREAT
для open()
.
• Системные вызовы read()
и write()
соответственно читают и записывают данные. Их интерфейс прост. В частности, они не интерпретируют данные, файлы представлены линейными потоками байтов. Системный вызов lseek()
осуществляет ввод/выводе произвольным доступом: возможность перемещаться внутри файла.
• Для синхронного ввода/вывода предусмотрены дополнительные флаги для open()
, при этом данные записываются на физический носитель данных до возвращения write()
или read()
. Можно также форсировать запись данных на диск на управляемой основе с помощью fsync()
или fdatasync()
.
• Системные вызовы truncate()
и ftruncate()
устанавливают абсолютную длину файла. (На более старых системах они могут использоваться лишь для сокращения длины файла; на современных системах они могут также увеличивать файл.)