Linux программирование в примерах | страница 89



>действительные_права = (затребованные_права & (~umask));

>umask обычно устанавливается с помощью команды >umask в >$НОМЕ/.profile, когда вы входите в систему. Из программы С она устанавливается с помощью системного вызова >umask().

>#include /* POSIX */

>#include mode_t umask(mode_t mask);

Возвращается старое значение >umask. Поэтому для определения текущей маски нужно установить новое значение, а затем восстановить старое (или изменить его при необходимости):

>mode_t mask = umask(0); /* получить текущую маску */

>(void)umask(mask); /* восстановить ее */

Вот пример работы >umask на уровне оболочки:

>$ umask /* Показать текущую маску */

>0022

>$ touch newfile /* Создать файл */

>$ ls -l newfile /* Показать права доступа нового файла */

>-rw-r--r-- 1 arnold devel 0 Mar 24 15:43 newfile

>$ umask 0 /* Установить пустую маску */

>$ touch newfile2 /* Создать второй файл */

>$ ls -l newfile2 /* Показать права доступа нового файла */

>-rw-rw-rw- 1 arnold devel 0 Mar 24 15:44 newfile2

4.6.2. Создание файлов с помощью >creat()

Системный вызов >creat()[49] создает новые файлы. Он объявлен следующим образом:

>#include /* POSIX */

>#include

>#include


>int creat(const char *pathname, mode_t mode);

Аргумент >mode представляет права доступа к новому файлу (как обсуждалось в предыдущем разделе). Создается файл с именем >pathname.с данными правами доступа, модифицированными с использованием >umask. Он открыт (только) для чтения, а возвращаемое значение является дескриптором нового файла или -1, если была проблема. В последнем случае >errno указывает ошибку. Если файл уже существует, он будет при открытии урезан.

Во всех остальных отношениях дескрипторы файлов, возвращаемые >creat(), являются теми же самыми, которые возвращаются >open(); они используются для записи и позиционирования и должны закрываться при помощи >close():

>int fd, count;

>/* Проверка ошибок для краткости опущена */

>fd = creat("/some/new/file", 0666);

>count = write(fd, "some data\n", 10);

>(void)close(fd);

4.6.3. Возвращаясь к open()

Вы можете вспомнить объявление для >open():

>int open(const char *pathname, int flags, mode_t mode);

Ранее мы сказали, что при открытии файла для простого ввода/вывода мы можем игнорировать аргумент >mode. Хотя, посмотрев на >creat(), вы, возможно, догадались, что >open() также может использоваться для создания файлов и что в этом случае используется аргумент >mode. Это в самом деле так.

Помимо флагов