Ошибка в разделе "2.6. Операции отношения и логические операции"? |
Интерфейс системы UNIX
8.3. Открытие, создание, закрытие и расцепление (UNLINK)
Кроме случая, когда по умолчанию определены стандартные файлы ввода, вывода и ошибок, вы должны явно открывать файлы, чтобы затем читать из них или писать в них. Для этой цели существуют две точки входа: open и creat.
функция open весьма сходна с функцией fopen, рассмотренной в "лекции №7" , за исключением того, что вместо возвращения указателя файла она возвращает дескриптор файла, который является просто целым типа int.
int fd; fd=open(name,rwmode);
Как и в случае fopen, аргумент name является символьной строкой, соответствующей внешнему имени файла. Однако аргумент, определяющий режим доступа, отличен: rwmode равно: 0 - для чтения, 1 - для записи, 2 - для чтения и записи. Если происходит какая-то ошибка, функция open возвращает " -1 "; в противном случае она возвращает действительный дескриптор файла.
Попытка открыть файл, который не существует, является ошибкой. Точка входа creat предоставляет возможность создания новых файлов или перезаписи старых. В результате обращения
fd=creat(name,pmode);
возвращает дескриптор файла, если оказалось возможным создать файл с именем name, и " -1 " в противном случае. Если файл с таким именем уже существует, creat усечет его до нулевой длины; создание файла, который уже существует, не является ошибкой.
Если файл является совершенно новым, то creat создает его с определеным режимом защиты, специфицируемым аргументом pmode. В системе файлов на UNIX с файлом связываются девять битов защиты информации, которые управляют разрешением на чтение, запись и выполнение для владельца файла, для группы владельцев и для всех остальных пользователей. Таким образом, трехзначное восьмеричное число наиболее удобно для спецификации разрешений. Например, число 0755 свидетельствует о разрешении на чтение, запись и выполнение для владельца и о разрешении на чтение и выполнение для группы и всех остальных.
Для иллюстрации ниже приводится программа копирования одного файла в другой, являющаяся упрощенным вариантом утилиты cp системы UNIX. (Основное упрощение заключается в том, что наш вариант копирует только один файл и что второй аргумент не должен быть справочником).
#define null 0 #define bufsize 512 #define pmode 0644/*rw for owner,r for group,others*/ main(argc,argv) /*cp: copy f1 to f2*/ int argc; char *argv[]; { int f1, f2, n; char buf[bufsize]; if (argc ! = 3) error("usage:cp from to", null); if ((f1=open(argv[1],0))== -1) error("cp:can't open %s", argv[1]); if ((f2=creat(argv[2],pmode))== -1) error("cp: can't create %s", argv[2]); while ((n=read(f1,buf,bufsize))>0) if (write(f2,buf,n) !=n) error("cp: write error", null); exit(0); } error(s1,s2) /*print error message and die*/ char* s1, s2; { printf(s1,s2); printf("\n"); exit(1); }
Существует ограничение (обычно 15 - 25) на количество файлов, которые программа может иметь открытыми одновременно. В соответствии с этим любая программа, собирающаяся работать со многими файлами, должна быть подготовлена к повторному использованию дескрипторов файлов. процедура close прерывает связь между дескриптором файла и открытым файлом и освобождает дескриптор файла для использования с некоторым другим файлом. Завершение выполнения программы через exit или в результате возврата из ведущей программы приводит к закрытию всех открытых файлов.
функция расцепления unlink (filename) удаляет из системы файлов файл с именем filename ( из данного справочного файла. Файл может быть сцеплен с другим справочником, возможно, под другим именем - примеч. переводчика).
Упражнение 8-1
Перепишите программу cat из "лекции №7" , используя функции read, write, open и close вместо их эквивалентов из стандартной библиотеки. Проведите эксперименты для определения относительной скорости работы этих двух вариантов.