Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.практикумСП.doc
Скачиваний:
39
Добавлен:
31.03.2015
Размер:
5.99 Mб
Скачать

11.5. Системный вызов write()

Системный вызов write() позволяет записывать информацию в файл. Преимущество write() состоит в том, что он обходит дополнительный этап буферирования, обеспечиваемый библиотечными функциями С, и поэтому является очень быстрым. Синтаксис системного вызова следующий: ssize_t write (int fd, void* buf, size_t count). Системный вызов write() копирует count байтов из буфера buf в файл, заданный дескриптором файла fd. Байты записываются, начиная с текущей позиции файлового указателя, который затем обновляется. Если флаг O_APPEND был установлен для fd, позиция файлового указателя перемешается на конец файла перед каждой записью. Если системный вызов завершился успешно, write() возвращает количество записанных байтов, иначе возвращает -1.

Пример. Запись в файл. Следующие строки демонстрируют выполнение записи:

charsWritten = write (fd, buffer, charsRead);

if (charsWritten != charsRead) fatalError();

11.6. Системный вызов lseek()

Системный вызов lseek() позволяет изменять текущую позицию дескриптора файла. Синтаксис системного вызова следующий: off_t lseek (int fd, off_t offset, int mode), где fd – дескриптор файла, offset – смещение. Параметр mode описывает, как смещение должно интерпретироваться. Три возможных режима определены в файле /usr/include/stdio.h и имеют значения, представленные в таблице 11.4.

Таблица 11.4

Режимы смещения

Величина

Описание

SEEK_SET

Смещение offset относительно начала файла

SEEK_CUR

Смещение offset относительно текущей позиции файла

SEEK_END

Смещение offset относительно конца файла

Системный вызов lseek() завершается с ошибкой, если будет осуществлена попытка перемещения за начало файла. Если системный вызов завершился успешно, lseek() возвращает текущую позицию файла, иначе возвращает -1.

11.7. Системный вызов close()

Системный вызов close() позволяет освободить дескриптор файла. Синтаксис системного вызова следующий: int close (int fd), где fd – дескриптор файла. Если fd – последний дескриптор файла, связанный с конкретным открытым файлом, ресурсы ядра, отведенные для файла, освобождаются. Если осуществляется попытка закрытия файла, который уже закрыт, происходит ошибка. При нормальном завершении системный вызов close() возвращает 0, иначе возвращает -1.

Пример. Закрытие файла. Следующая строка демонстрирует выполнение закрытия файла:

close (fd);

11.8. Задания для самостоятельной работы

1. Напишите программу на языке Си копирования файла в файл с использованием описанных выше системных вызовов.

2. Напишите программу на языке Си организации файла прямого доступа с использованием системного вызова lseek().

3. Напишите программу на языке Си, которая переставляет символы строки из ввода в обратном порядке и посылает их на стандартный вывод.

4. Разработайте программу на языке Си, которая в результате своего выполнения создавала бы файл с именем name и помещала в него N логических блоков, не содержащих никакой информации, а размер логического блока был бы равен S байт.

5. Разработайте программу на языке Си, которая последовательно обрабатывала бы несколько текстовых файлов так, чтобы число этих файлов можно было бы указать в командной строке.