Теория вычислительных процессов и структур — страница 3

  • Просмотров 6040
  • Скачиваний 318
  • Размер файла 78
    Кб

файлами и каталогами. Теоретическая часть Для выполнения операций записи и чтения данных в существующем файле его следует открыть при помощи системного вызова open. Ниже приведено описание этого вызова: # include <sys / types.h> # include <sys / stat.h> # include <fcnt1.h> int open (const char *pathname, int flags, [mode_t mode]); Первый аргумент, pathname, является указателем на строку маршрутного имени открываемого файла. Значение pathname может быть абсолютным путём, например: /usr /

keith / junk. Данный путь задаёт положение файла по отношению к корневому каталогу. Аргумент pathname может также быть относительным путём, задающим маршрут от текущего каталога к файлу, например: keith / junk или просто junk. В последнем случае программа откроет файл junk в текущем каталоге. В общем случае, если один из аргументов системного вызова или библиотечной процедуры – имя файла, то в качестве него можно задать любое допустимое

маршрутное имя файла UNIX. Второй аргумент системного вызова open - flags - имеет целочисленный тип и определяет метод доступа. Параметр flags принимает одно из значений, заданных постоянными в заголовочном файле <fcnt1.h> при помощи директивы препроцессора #define ( fcnt1 является сокращением от file control - «управление файлом»). В файле <fcnt1.h> определены три постоянных: O_RDONLY – открыть файл только для чтения, O_WRONLY – открыть файл только для

записи, O_RDWR – открыть файл для чтения и записи. В случае успешного завершения вызова open и открытия файла возвращаемое вызовом open значение будет содержать неотрицательное целое число – дескриптор файла. В случае ошибки вызов open возвращает вместо дескриптора файла значение –1. Это может произойти, например, если файл не существует. Третий параметр mode, является необязательным, он используется только вместе с флагом O_CREAT.

Следующий фрагмент программы открывает файл junk для чтения и записи и проверяет, не возникает ли при этом ошибка. Этот последний момент особенно важен: имеет смысл устанавливать проверку ошибок во все программы, которые используют системные вызовы, поскольку каким бы простым ни было приложение, иногда может произойти сбой. В приведенном ниже примере используются библиотечные процедуры printf для вывода сообщения и exit – для

завершения процесса: # include <stdlib.h> /* Для вызова exit */ # include <fcnt1.h> char workfile=”junk”; / Задать имя рабочего файла */ main() { int filedes; /* Открыть файл, используя постоянную O_RDWR из <fcnt1.h> */ /* Файл открывается для чтения / записи */ if ((filedes=open(workfile, O_RDWR)) = = -1) { printf (“Невозможно открыть %sn”, workfile); exit (1); /* Выход по ошибке */ } /* Остальная программа */ exit (0); /* Нормальный выход */ } Вызов open может использоваться для создания файла, например: filedes = open