![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Fd=creat(name, mode) Один из способов создания нового файла
Fd=open(file, how, j) Открыть файл для чтения, записи или и того и другого
S=close(fd) Закрыть открытый файл
N=read(fd, buffer, nbytes) Прочитать данные из файла в буфер
N=write(fd, buffer, nbytes) Записать данные из буфера в файл
Position=lseek(fd, offset, whence) Переместить указатель в файле
S=stat(name, &buf) Получить информацию о состоянии файла "
S=fstat(fd, &buf) Получить информацию о состоянии файла
S=pipe(&fd[0]) Создать канал '*п
S=fcntl(fd, cmd,...) Блокировка файла и другие операции
Когда программа начинает выполнение стандартным образом, файлы с дескрипторами 0, 1 и 2 уже открыты для стандартного ввода, стандартного вывода и стандартного потока сообщений об ошибках соответственно. Таким образом, фильтр, например программа sort, может просто читать свои входные данные из файла с дескриптором 0, а писать выходные данные в файл с дескриптором 1, не заботясь о том, где располагаются эти файлы. Работа этого механизма обеспечивается оболочкой, которая проверяет, чтобы эти дескрипторы соответствовали нужным файлам, прежде чем программа начнет свою работу.
Чаще всего программы используют системные вызовы read и write. У обоих вызовов по три параметра: дескриптор файла (указывающий, с каким из открытых файлов будет производиться операция чтения или записи), адрес буфера (сообщающий, куда положить данные или откуда их взять), а также счетчик байтов (указывающий, сколько байтов следует прочитать или записать). Вот и все. Очень простая схема. Пример типичного вызова:
П = read(fd. buffer, nbytes)
Хотя большинство программ читают и записывают файлы последовательно, некоторым программам бывает необходимо иметь доступ к произвольной части файла. С каждым открытым файлом связан указатель на текущую позицию в файле. При последовательном чтении или записи он указывает на следующий байт, который будет прочитан или записан. Например, если указатель установлен на 4096-й байт, то после успешного чтения 1024 байт из этого файла при помощи системного вызова read он будет указывать на 5120-й байт. Указатель в файле можно переместить с помощью системного вызова lseek, что позволяет при следующих обращениях к системным вызовам read и write читать данные из файла или писать их в файл в произвольной позиции в файле и даже за концом файла. Этот системный вызов назван lseek, чтобы не путать его с теперь уже устаревшим, использовавшимся ранее на 16-разрядных компьютерах системным вызовом seek.
У системного вызова 1 seek три параметра: первый — это дескриптор файла, второй — новая позиция в файле, а третий сообщает, указывается ли эта позиция относительно начала файла, конца файла или относительно текущей позиции. Значение, возвращаемое системным вызовом lseek, представляет собой абсолютную позицию в файле после того, как указатель был перемещен. Забавно, что системный вызов lseek (seek означает поиск, термин, также используемый для перемещения блока головок диска) никогда не вызывает перемещения блока головок диска, так как все, что он делает, — это обновление текущей позиции в файле, представляющей собой просто число в памяти.
Для каждого файла операционная система UNIX хранит такие сведения, как тип (режим) файла (обычный, каталог, специальный файл), его размер, время последнего изменения и т. д. Программы могут получить эту информацию при помощи системного вызова stat. Первый параметр представляет собой имя файла. Второй является указателем на структуру, в которую следует поместить требуемую информацию. Поля этой структуры перечислены в табл. 10.11. Системный вызов fstat представляет собой то же самое, что и системный вызов stat, с той разницей, что он работает с уже открытым файлом (имя которого может быть неизвестно), а не с путем.
Таблица 10.11. Поля структуры, возвращаемой системным вызовом stat
Устройство, на котором располагается файл
Номер i-узла (идентифицирует файл на устройстве)
Режим файла (включая информацию о защите)
Количество связей файла
Идентификатор владельца файла
Группа, к которой принадлежит файл
Размер файла в байтах
Время создания
Время последнего доступа
Время последнего изменения
Системный вызов pipe используется для создания каналов оболочки. Он создает псевдофайл для буферирования данных, которыми обмениваются компоненты канала, и возвращает дескрипторы файлов для чтения и записи буфера. В команде
Sort <in | head -30
Дескриптор файла 1 (стандартный вывод) в процессе, выполняющем программу sort, будет настроен оболочкой на запись в канал, а дескриптор файла 0 (стандартный ввод) в процессе, выполняющем программу head, будет настроен на чтение из канала. Программа sort просто читает из файла с дескриптором 0 (установлен на файл in) и пишет в файл с дескриптором 1 (канал), даже не зная, что оба эти файла переопределены. Если бы ввод и вывод не были перенаправлены, программа sort читала бы данные с клавиатуры и выводила бы их на экран (устройства по умолчанию). Подобным же образом, когда программа head считывает входные данные из файла с дескриптором 0, она получает данные, которые программа sort поместила в буфер канала, даже не зная, что канал используется. Вот пример того, как простая концепция (перенаправление потока данных) плюс простая реализация (файлы с дескрипторами 0 и 1) вместе дают мощный инструмент (соединение программ произвольным образом без необходимости их модификации).
Последний системный вызов в табл. 10.10 — это fcntl. Он используется для блокировки и разблокирования файлов, а также некоторых других специфических для файлов операций.
Рассмотрим теперь некоторые системные вызовы, относящиеся скорее к каталогам или файловой системе в целом, нежели к какому-либо конкретному файлу. Наиболее часто употребляемые системные вызовы перечислены в табл. 10.12. (В случае ошибки возвращаемое значение s равно -1, dir идентифицирует каталог, a dirent представляет собой запись каталога.) Каталоги создаются и удаляются при помощи системных вызовов mkdir и rmdir соответственно. Каталог может быть уничтожен, только если он пуст.
Как было показано на рис. 10.14, при создании связи с файлом создается новая запись в каталоге, указывающая на существующий файл. Связь создается при помощи системного вызова 1 ink. В параметрах этого системного вызова указываются исходное и новое имя. Записи в каталоге удаляются системным вызовом unl i nk. Когда удаляется последняя связь с файлом, файл также автоматически удаляется. Если для файла не было создано ни одной связи, то при первом же обращении к системному вызову unl ink файл будет удален.
Таблица 10.12. Некоторые системные вызовы, имеющие отношение к работе с каталогом
Дата публикования: 2015-01-24; Прочитано: 236 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!