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

1.3. Ошибки, связанные с именами файлов

Функции, которые принимают как аргументы имена файлов обычно, обнаруживают эти errno - условия ошибки в отношении синтаксиса имени файла:

EACCES

процесс не имеет права поиска для каталога - компонента имени файла.

ENOENT

Об этой ошибке сообщается, когда файл, вызванный как каталог не существует, или когда компонент есть символическая связь, чей выходной файл не существует.

ENOTDIR

Файл, который вызван как, каталог существует, но это не каталог.

В дополнение к обычным синтаксическим ошибкам имени файла следующие errno условия ошибки определены для этой функции:

EACCES

Файл существует, но не читаем/перезаписываем как запрошено аргументом flags.

EEXIST

O_CREAT и O_EXCL - установлены, а именованный файл уже существует.

EISDIR

Аргумент flags задает доступ для записи, а файл - каталог.

EMFILE

Процесс имеет слишком много открытых файлов.

ENOENT

Именованный файл не существует, но O_CREAT не определен.

ENOSPC

Каталог или файловая система, которая содержала бы новый файл, не может быть расширена, т. к. там не осталось дискового пространства.

1.4. Доступ к файлу

Функции, реализующие системные вызовы ввода/вывода QNX, следуюшие:

#include<unistd.h>

ssize_t write(int fd, void *buf, size_t nbyte);// Эти функции

ssize_t read(int fd, void *buf, size_t nbyte);// объявлены в файле

off_t lseek(int fd, off_t offset, int whence);// 'unistd.h '

off_t tell(int fd);

int close(intfd);

В представленных функциях аргумент fd является дескриптором открытого файла.

Функция write() записывает в файл nbyte байт из буфера buf и возвращает количество записанных байт.

Функция read() читает из файла nbyteбайт и записывает их в буфер buf, возвращает количество считанных.

Функция lseek()смещает указатель позиции файла на величину offsetотносительно указанной базы whence, которая может принимать значения: SEEK_SET– от начала файла, SEEK_END– от конца файла, SEEK_CUR– от текущей позиции. Возвращает новое значение позиции.

Функция tell() возвращает текущее значение позиции файла (указателя файла).

Функция close() закрывает файл и возвращает нулевое значение. Все функции в случае ошибки возвращают -1 и устанавливают errno.

Тип данных: ssize_t

Этот тип данных используется для представления размеров блоков, которые могут быть прочитаны или записаны одиночной операцией. Он подобен size _t, но должен быть знаковым типом.

Функция: ssize_t read (int filedes, void *buffer, size_t size)

Функция read читает до size байтов из файла с описателем filedes, сохраняя результаты в буфере. (Это - не обязательно символьная строка и не имеется никакого добавленного пустого символа завершения.)

Возвращаемое значение - число байтов фактически прочитанных. Оно может быть меньше чем size.

Нулевое значение указывает конец файла (за исключением того, если значение аргумента size является также нулем). Это не является ошибкой.

Если read возвращает по крайней мере один символ, не имеется никакого способа, которым Вы можете узнать, был ли конец файла достигнут. Но если Вы достигали конца, следующий read возвратит нуль.

В случае ошибки read возвращает -1. Следующие errno условия ошибки определены для этой функции:

EAGAIN

Обычно, когда никакой ввод недоступен, read ждет какого-нибудь ввода. Но если установлен флаг O_NONBLOCK, read возвращается немедленно не читая никаких данных, и сообщает эту ошибку.

EBADF

Filedes аргумент - не допустимый описатель файла.

Функция read - основной примитив для всех функций, которые читают из потоков, типа fgetc.

Функция: ssize_t write (int filedes, const void *buffer, size_t size)

Функция write пишет до size байтов из буфера в файл с описателем filedes. Данные в буфере - не обязательно символьная строка и вывод пустого символа подобен любому другому.

Возвращаемое значение - число байтов, фактически записанных. Это - обычно size, но могло бы быть и меньшее количество. В случае ошибки, write возвращает -1. Следующие errno условия ошибки определены для этой функции:

EAGAIN

Обычно, write блокируется до завершения операции записи. Но если для файла установлен O_NONBLOCK флаг, она возвращается немедленно, не производя записи любых данных, и сообщает эту ошибку.

EBADF

Аргумент Filedes - не допустимый дескриптор файла.

Функция write - основной примитив для всех функций записи в поток, типа fputc.

Установка Файловой позиции Дескриптора.

Точно как Вы можете устанавливать файловую позицию потока функцией fseek, Вы можете устанавливать файловую позицию дескриптора функцией lseek. Она определяет позицию в файле для следующей операции read или write. См. Раздел 7.15 [Позиционирование Файла], для подробной информации относительно файловой позиции и что это означает.

Для получения текущего значения файловой позиции из описателя, используйте lseek (desc, 0, SEEK_CUR).

Функция: off_t lseek (int filedes, off_t offset, int whence)

Тип данных: оff_t - арифметический тип данных, используемый, чтобы представить размеры файла.

Функция lseek используется, чтобы изменить файловую позицию файла с описателем filedes. Аргумент whence определяет, как смещение должно интерпретироваться и может быть одной из символических констант SEEK_SET, SEEK_CUR, или SEEK_END.

SEEK_SET

Определяет, что whence - число символов от начала файла.

SEEK_CUR

Определяет, что whence - число символов от текущей файловой позиции. Этот число может быть положительно или отрицательно.

SEEK_END

Определяет, что whence - число символов с конца файла. Отрицательное число определяет позицию внутри текущего тела файла; положительное число определяет позицию после текущего конца. Если Вы устанавливаете позицию после текущего конца, и фактически записываете данные, Вы расширяете файл нулями до этой позиции.

Возвращаемое значение lseek - обычно возникающая в результате файловая позиция, измеряемая в байтах от начала файла. Вы можете использовать это средство вместе с SEEK_CUR для чтения текущей файловой позиции.

Вы можете устанавливать файловую позицию после текущего конца файла. Это делает файл больше; lseek никогда не изменяет файл. Но последующий вывод в ту позицию расширит файла.

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

EBADF

Filedes - не допустимый описатель файла.

EINVAL

Значение аргумента whence не допустимо, или возникающее в результате смещение файла не допустимо.

Функция lseek - основной примитив для fseek, ftell и rewind функций, которые функционируют на потоках вместо описателей файла.

Дублирование дескриптора файла.

Вы можете иметь многократные описатели для того же самого файла, если Вы открываете файл больше чем один раз, или если Вы дублируете описатель с dup.

Можно создать копию дескриптора открытого файла такую, что новый дескриптор, будет иметь следующие общие свойства с исходным дескриптором файла:

       тот же открытый файл или устройство;

       тот же указатель файла (это означает, что изменение одного указателя файла влечет  за собой и изменение другого);

       тот же режим доступа (чтение, запись, чтение/запись).

Для получения копии используются функции:

#include<unistd.h>

int dup(int fd);

int dup2(int fd, int fd2);

При успешном выполнении dup() возвращает новый дескриптор файла - целое неотрицательное число. При успешном выполнении функция dup2() делает дескриптор fd2 копией дескриптора fd и возвращает 0. Если уже имеется открытый файл с дескриптором fd2, то он предварительно закрывается. В случае ошибки обе функции возвращают -1 и устанавливается errno.

Дескрипторы, которые исходят из отдельных обращений open, имеют независимые файловые позиции; использование lseek на одном дескрипторе не производит никакого эффекта на другой.

Например,

{

int d1, d2;

char buf[4];

d1 = open ('foo', O_RDONLY);

d2 = open ('foo', O_RDONLY);

lseek (d1, 1024, SEEK_SET);

read (d2, buf, 4);

}

будет читать первые четыре символа файла 'foo'. (Код с обнаружением ошибок, необходимый для реальной программы был опущен здесь для краткости.)

Напротив, описатели, сделанные дублированием совместно используют общую файловую позицию с первоначальным описателем, который был дублирован. Изменение файловой позиции одного из дубликатов, включая чтение или запись данных, воздействует на все из них. Таким образом, например,

{

int d1, d2, d3;

char buf1[4], buf2[4];

d1 = open ('foo', O_RDONLY);

d2 = dup (d1);

d3 = dup (d2);

lseek (d3, 1024, SEEK_SET);

read (d1, buf1, 4);

read (d2, buf2, 4);

}

будет читать четыре символа, начиная с 1024-го символа 'foo', и еще четыре символа, начиная с 1028-го символа.

Функция: int close (int filedes)

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

  • Описатель файла освобожден.

  • Любые блокировки записи, принадлежащие процессу на файле разблокируются.

Нормальное возвращаемое значение - 0; значение -1 возвращается в случае ошибки.

Следующие errno условия ошибки определены для этой функции:

  • EBADF Filedes аргумент - не допустимый дескриптор файла.