Linux программирование в примерах | страница 89
>действительные_права = (затребованные_права & (~umask));
>umask
обычно устанавливается с помощью команды >umask
в >$НОМЕ/.profile
, когда вы входите в систему. Из программы С она устанавливается с помощью системного вызова >umask()
.
>#include
>#include
Возвращается старое значение >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
>#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
. Это в самом деле так.
Помимо флагов