Опубликован: 05.07.2006 | Уровень: для всех | Доступ: платный
Лекция 9:

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

Ярослав Воробей
Ярослав Воробей
Россия
Дмитрий Левин
Дмитрий Левин
Россия