Главная » Программирование для UNIX » Создание файла – open, creat, close, unlink

0

Помимо использования стандартных файлов ввода, вывода и вывода ошибок, вам потребуется явно  открывать файлы для  чтения и записи. Для  этой цели существуют два системных вызова: open и creat.1

Функция open аналогична fopen из предыдущей главы за исключением того,  что она возвращает не указатель файла, а файловый дескриптор, имеющий тип int.

char  *name;

int fd, rwmode;

fd  = open(name,  rwmode);

Как и в fopen, параметр name  – это строка, содержащая имя  файла. А вот параметр типа доступа отличается: rwmode имеет  значение 0 для чтения, 1 для записи и 2 для чтения и записи. Функция open возвращает –1 в случае ошибки, а при успешном завершении – дескриптор файла.

Попытка открытия  существующего файла  приводит к ошибке. Для  создания новых файлов и для перезаписи уже существующих предназначен системный вызов creat.

int  perms;

fd  = creat(name,  perms);

Функция creat возвращает дескриптор файла, если ей удалось его создать, и –1 в противном случае. Если файл не существует, то creat созда-

1        Кена  Томпсона (Ken  Thompson) однажды  спросили, что  бы он изменил в UNIX, если бы довелось перепроектировать систему заново. Он ответил: «Я бы написал creat с буквой e».

ет  его  с правами доступа, указанными в  параметре perms.  Если  же файл уже существует, то creat обрежет его до нулевой длины; вызов creat для  уже  существующего файла не является ошибкой. (Права доступа  не  изменятся.) Независимо от значения perms  созданный файл открыт для записи.

Как  рассказывалось в главе 2, информация о правах доступа к файлу хранится в девяти  битах, определяющих разрешение на  чтение,  запись  и  исполнение, поэтому их  принято  представлять трехзначным восьмеричным числом. Например, 0755 определяет разрешение на чтение,  запись и выполнение для владельца и на чтение и выполнение для  группы и для остальных. Не забывайте начинать восьмеричные числа с 0, как это принято в языке Си.

Для  иллюстрации приведем упрощенную версию команды cp. Главное упрощение заключается в том,  что наша версия копирует только один файл и не позволяет в качестве второго аргумента указывать каталог. Второй  изъян состоит  в том,  что данная версия не сохраняет права доступа  исходного файла (дальше будет показано, как с этим справиться).

/*  cp:  минимальная  версия */

#include <stdio.h>

#define PERMS  0644 /*  RW   для владельца,  R  для группы  и остальных */ char  *progname;

main(argc, argv)    /*  cp:  копировать f1  в  f2  */ int argc;

char  *argv[];

{

int f1,  f2, n; char  buf[BUFSIZ];

progname  =  argv[0]; if  (argc  !=  3)

error("Usage:  %s  from  to",  progname); if  ((f1  =  open(argv[1],  0))  ==  –1)

error("can’t open %s", argv[1]);

if ((f2 =  creat(argv[2],  PERMS))  ==  –1) error("can’t  create  %s",  argv[2]);

while  ((n =  read(f1,  buf,  BUFSIZ))  >  0) if  (write(f2,  buf,  n)  !=  n)

error("write  error",  (char  *)  0); exit(0);

}

Функция error будет описана в следующем разделе.

Существует ограничение (значение NOFILE в sys/param.h, обычно  около

20) количества файлов, одновременно открываемых программой. Следовательно, если программа собирается работать с многими файлами, ей  следует позаботиться  о  повторном  использовании  файловых  де-

скрипторов. Системный вызов close разрывает  связь между именем файла и его дескриптором, освобождая таким образом дескриптор для использования с другим файлом. Завершение программы посредством вызова exit или выхода из main вызывает закрытие всех файлов.

Системный вызов unlink  удаляет имя; файл  удаляется, если  это  последняя ссылка.

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии