Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

Когда вы создаете файл, вы должны знать, какую защиту необходимо назначить новому файлу. Вы можете сделать это с помощью простого восьмеричного числа, если захотите, и такие числа довольно обычно можно увидеть в старом коде. Однако, лучше использовать побитовую операцию OR для одной или более символических имен из

<sys/stat.h>
, описанных в табл. 4.5.

Таблица 4.5. Символические имена POSIX для режимов доступа к файлу

Символическое имя Значение Комментарий
S_IRWXU
00700 Разрешение на чтение, запись и исполнение для владельца
S_IRUSR
00400 Разрешение
на чтение для владельца
S_IREAD
Аналогично
S_IRUSR
S_IWUSR
00200 Разрешение на запись для владельца
S_IWRITE
Аналогично
S_IWUSR
S_IXUSR
00100 Разрешение на исполнение для владельца.
S_IEXEC
Аналогично
S_IXUSR
S_IRWXG
00070 Разрешение на чтение, запись и исполнение для группы
S_IRGRP
00040 Разрешение на чтение для группы
S_IWGRP
00020 Разрешение на запись для группы.
S_IXGRP
00010 Разрешение на исполнение для группы
S_IRWXO
00007 Разрешение на чтение, запись и исполнение для остальных.
S_IROTH
00004 Разрешение на чтение для остальных.
S_IWOTH
00002 Разрешение на запись для остальных
S_IXOTH
00001 Разрешение на исполнение для остальных

Следующий фрагмент показывает, как создать переменные, представляющие разрешения

– rw-r--r--
и
– rwxr-xr-x
(0644 и 0755 соответственно):

mode_t rw_mode, rwx_mode;

rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 0644 */

rwx_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; /* 0755 */

Более старый код использовал

S_IREAD
,
S_IWRITE
и
S_IEXEC
вместе со сдвигом битов для получения того же результата:

mode_t rw_mode, rwx_mode;

rw_mode = (S_IREAD|S_IWRITE) | (S_IREAD >> 3) | (S_IREAD >> 6); /* 0644 */

rwx_mode = (S_IREAD|S_IWRITE|S_IEXEC) |

 ((S_IREAD|S_IEXEC) >> 3) | ((S_IREAD|S_IEXEC) >> 6); /* 0755 */

К сожалению, ни одна из записей не является очень удобной. Современные версии предпочтительнее, поскольку у каждого бита доступа есть собственное имя и меньше вероятность неправильного выполнения побитовых операций.

При изменении прав доступа к файлу для использования доступны биты дополнительных разрешений, показанные в табл. 4.6, но они не должны использоваться при первоначальном создании файла. Возможность включения этих битов

широко варьирует между операционными системами. Лучше всего не пробовать; вместо этого следует изменить права доступа к файлу явным образом после его создания. (Изменение прав доступа описано в разделе 5.5.2 «Изменение прав доступа:
chmod
и
fchmod
». Значения этих битов обсуждаются в главе 11 «Права доступа и идентификаторы пользователя и группы».)

Таблица 4.6. Дополнительные символические имена POSIX для режимов доступа к файлам

Символическое имя Значение Смысл
S_ISUID
04000 Установить ID пользователя
S_ISGID
02000 Установить ID группы
S_ISVTX
01000 Сохранить текст

Когда стандартные утилиты создают файлы, они по умолчанию используют права доступа

– rw-rw-rw-
(или 0666). Поскольку большинство пользователей предпочитают избегать файлов, в которые может записывать кто угодно, каждый процесс имеет при себе umask.
umask
является набором битов допуска, указывающим те биты, которые никогда не должны устанавливаться при создании новых файлов, (umask не используется при изменении прав доступа.) Концептуально осуществляется операция

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

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

#include <sys/types.h> /* POSIX */

#include <sys/stat.h> 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] создает новые файлы. Он объявлен следующим образом:

49

Да, это пишется так. Кена Томпсона (Ken Thompson), одного из двух «отцов» Unix, однажды спросили, что бы он сделал по-другому, если бы ему пришлось переделать Unix. Он ответил, что написал бы

creat
с «e» на конце. И в самом деле, именно это он сделал для операционной системы Plan 9 From Bell LabsПримеч. автора.

Поделиться:
Популярные книги

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

Правила Барби

Аллен Селина
4. Элита Нью-Йорка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Правила Барби

Морозная гряда. Первый пояс

Игнатов Михаил Павлович
3. Путь
Фантастика:
фэнтези
7.91
рейтинг книги
Морозная гряда. Первый пояс

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Маленькая слабость Дракона Андреевича

Рам Янка
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Маленькая слабость Дракона Андреевича

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Последняя Арена

Греков Сергей
1. Последняя Арена
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.20
рейтинг книги
Последняя Арена