|
|
Интерфейс системы 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 вместо их эквивалентов из стандартной библиотеки. Проведите эксперименты для определения относительной скорости работы этих двух вариантов.
