Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Системный вызов Описание



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; Прочитано: 216 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...