Одной из отличительных черт модели ввода-вывода в системах UNIX является понятие универсальности ввода-вывода. Это означает, что одни и те же системные вызовы (open()
, read()
, write()
, close()
и т. д.) используются для выполнения ввода-вывода во всех типах файлов, включая устройства. (Ядро преобразует запросы приложений на ввод/вывод в соответствующие операции файловой системы или драйверов устройств, выполняющие ввод/вывод в отношении целевого файла или устройства.) Из этого следует, что программа, использующая эти системные вызовы, будет работать с любым типом файлов.
По сути, ядро выдает один тип файла: последовательный поток байтов, к которому, в случае файлов на дисках, дисков и ленточных накопителей, можно получить произвольный доступ с помощью системного вызова lseek()
.
Многие приложения и библиотеки интерпретируют символ новой строки, или символ конца строки (имеющий десятичный ASCII-код 10) как завершающий одну строку текста и начинающий другую строку. В системах UNIX отсутствует символ конца файла, и конец файла определяется при чтении, не возвращающем данные.
Файловый дескриптор
Системные вызовы ввода-вывода ссылаются на открытый файл с использованием файлового дескриптора, представляющего собой неотрицательное (обычно небольшое) целое число. Файловый дескриптор обычно возвращается из выдачи системного вызова open()
, который получает в качестве аргумента путевое имя, а оно, в свою очередь, указывает на файл, в отношении которого будут выполняться операции ввода-вывода.
При запуске оболочкой процесс наследует, как правило, три дескриптора открытых файлов:
- дескриптор 0 является стандартным вводом — файлом, из которого процесс получает свой ввод;
- дескриптор 1 является стандартным выводом — файлом, в который процесс записывает свой вывод;
- дескриптор 2, являющийся стандартной ошибкой, — файлом, в который процесс записывает сообщения об ошибках и уведомления об исключительных и нештатных условиях.
В интерактивной оболочке или программе эти три дескриптора подключены, как правило, к терминалу. В библиотеке stdio они соответствуют файловым потокам stdin
, stdout
и stderr
.
Библиотека stdio
Для выполнения файлового ввода-вывода программы обычно используют функции ввода-вывода, содержащиеся в стандартной библиотеке языка С. Этот набор функций, известный как библиотека stdio, включает функции fopen()
, fclose()
, scanf()
, printf()
, fgets()
, fputs()
и t. д. Функции stdio
наслаиваются поверх системных вызовов ввода- вывода (open()
, close()
, read()
, write()
и т. д.).