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

11.3. Системный вызов open()

Системный вызов open() позволяет открыть или создать файл для чтения или записи. Синтаксис системного вызова следующий: int open (char* fileName, int mode [, int permissions]), где fileNameабсолютное или относительное имя пути, mode – поразрядное OR флага чтения/записи, с учетом или без учета некоторых смешанных флагов, permissions – число, которое кодирует значения флагов доступа к файлу, необходимо только, когда файл создается. Значения предопределенного флага чтения/записи и смешанных флагов заданы в файле /usr/include/fcntl.h.Флаги чтения/записи представлены в таблице 11.2. Смешанные флаги представлены в таблице 11.3.

Таблица 11.2

Флаги чтения/записи

Флаг

Описание

O_RDONLY

Открывает только для чтения

O_WRONLY

Открывает только для записи

O_RDWR

Открывает для чтения и записи

Таблица 11.3

Смешанные флаги

Флаг

Описание

O_APPEND

Позиция указателя в конце файла перед каждым write()

O_CREAT

Если файл не существует, создает его и устанавливает ID владельца на эффективный UID процесса. Значение umask используется при определении начальных значений флага доступа

O_EXCL

Если O_CREAT установлен и файл существует, тогда open() завершается с ошибкой

O_TRUNC

Если файл существует, он усекается до нулевой длины, open() возвращает неотрицательный дескриптор файла, если завершится успешно, иначе возвращается -1

Пример. Создание файла. Чтобы создать файл, используйте флаг O_CREAT в параметре mode и добавьте восьмеричное значение для начальной установки флага. Следующие строки создают временный файл с доступом на чтение и запись для владельца и затем открывают файл для чтения и записи:

sprintf ( tmpName, “.rev.%d”, getpid()); /* Случайное имя */

/* Создать временный файл для хранения копии ввода */

tmpfd = open (tmpName, O_CREAT | O_RDWR , 0600);

if (tmpfd = = -1) fatalError();

Функция getpid() является системным вызовом, который возвращает ID процесса (PID) – номер, который будет уникальным. Это удобный способ сформировать уникальное временное имя файла. Обратите внимание, что имя временного файла начинается с точки так, чтобы оно не появлялось в листинге утилиты ls. Файлы, которые начинаются с точки, называют скрытыми файлами.

Пример. Открытие существующего файла. Чтобы открыть существующий файл, задайте флаги параметра mode. Следующие строки демонстрируют открытие файла в режиме только для чтения:

fd = open (fileName, O_RDONLY);

if (fd = = -1) fatalError();

11.4. Системный вызов read()

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

Пример. Чтение файла. Следующие строки демонстрируют чтение файла:

charsRead = read (fd, buffer, BUFFER_SIZE);

if (charsRead = = 0) break; /* EOF */

if (charsRead = = -1) fatalError(); /* Ошибка */