Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Linux позволяет задавать, какие действия — чтение, запись, выполнение — разрешено осуществлять над файлом его владельцу, группе и остальным пользователям. Например, можно указать, что владелец имеет все права доступа к файлу, пользователям группы разрешено читать и выполнять файл (но не записывать в него), а остальные пользователи не должны получать к нему доступ.
Совокупность прав доступа к файлу называется кодом режима . Он состоит из трех триад битов, соответствующих владельцу, группе и остальным пользователям. В каждой триаде первый бит означает право чтения, второй — право записи, третий — право выполнения. Символьное представление этих битов называется строкой режима . Просмотреть ее можно с помощью команды ls -l
или системного вызова stat()
. Задание прав доступа к файлу осуществляется с помощью команды chmod
или одноименного системного вызова. Допустим, имеется файл hello
и требуется узнать права доступа к нему. Вот как это делается:
% ls -l hello
-rwxr-x--- 1 samuel csl 11734 Jan 22 16:29 hello
Третье и четвертое поля выводных данных сообщают о том, что файл принадлежит пользователю samuel
и группе csl
. В первом поле отображается строка режима. Начальный дефис указывает на то, что это обычный файл. В случае каталога здесь будет стоять буква d. Специальные файлы, например файлы устройств (см. главу 6, "Устройства") или каналы (см. раздел 5.4, "Каналы"), обозначаются другими буквами. Следующие три символа соответствуют правам владельца файла. В данном случае пользователь samuel
имеет право чтения, записи и выполнения файла. Далее указаны права группы, которой принадлежит файл. Пользователям группы разрешено читать и выполнять файл. Последние три символа в строке режима обозначают права остальных пользователей, которым запрещен доступ к файлу.
Давайте проверим, действительно ли все вышесказанное — правда. Для начала попробуем обратиться к файлу от имени пользователя nobody
, не входящего в группу csl
:
% id
uid=99(nobody) gid=99(nobody) groups=99(nobody)
% cat hello
cat: hello: Permission denied
% echo hi > hello
sh: ./hello: Permission denied
% ./hello
sh: ./hello: Permission denied
Команда cat
не смогла выполниться, потому что у нас нет права чтения файла. Запись в файл тоже не разрешена, поэтому потерпела неудачу команда echo
. А поскольку право выполнения также отсутствует, запустить программу hello
не удалось.
Посмотрим, что будет, если к файлу обратится пользователь mitchell
, являющийся членом группы csl
:
% id
uid=501 (mitchell) gid=501 {mitchell) groups=501 (mitchell), 503 (csl)
% cat hello
#!/bin/bash
echo "Hello, world."
% ./hello
Hello, world.
% echo hi > hello
bash: ./hello: Permission denied
В данном случае можно отобразить содержимое файла и запустить его на выполнение (файл является простейшим командным сценарием), но осуществить перезапись файла невозможно. Доступ для записи разрешен только владельцу файла (пользователь samuel
):
% id
uid=502(samuel) gid=502(samuel) groups=502(samuel),503(csl)
% echo hi > hello
% cat hello
hi
Менять режим доступа к файлу может только его владелец, а также суперпользователь. Если требуется разрешить всем пользователям запускать файл на выполнение, то это делается так:
% chmod o+k hello
% ls -l hello
-rwxr-x--x 1 samuel csl 3 Jan 22 16:38 hello
Обратите внимание на появление буквы x
в конце строки режима. Флаг о+x
команды chmod
означает добавление ( +
) права выполнения ( x
) для остальных пользователей ( о
). Если требуется, к примеру, отнять право записи у группы, следует задать такой флаг: g-w.
Функция stat()
позволяет определить режим доступа к файлу программным путем. Она принимает два аргумента: имя файла и адрес структуры, заполняемой информацией о файле. Подробнее функция stat()
описана в приложении Б, "Низкоуровневый ввод-вывод". Пример ее использования показан в листинге 10.2.
#include
#include
int main(int argc, char* argv[]) {
const char* const filename = argv[1];
struct stat buf;
/* Получение информации о файле. */
stat(filename, &buf);
/* Если владельцу разрешена запись в файл,
отображаем сообщение. */
if (buf.st_mode & S_IWUSR)
printf("Owning user can write '%s'.\n", filename);
return 0;
}
Если запустить программу с файлом hello
, будет выдано следующее:
% ./stat-perm hello
Owning user can write 'hello'.
Константа S_IWUSR
соответствует праву записи для владельца. Для каждого бита в строке режима существует своя константа. Например, константа S_IRGRP
обозначает право чтения для группы, а константа S_IXOTH
— право выполнения для остальных пользователей. Если невозможно получить информацию о файле, функция stat()
возвращает -1 и помещает код ошибки в переменную errno
.
С помощью функции chmod()
можно менять режим доступа к существующему файлу. Функции передаётся имя файла и набор флагов, соответствующих устанавливаемым битам доступа. Например, в следующей строке файл hello
делается доступным для чтения и выполнения владельцу, а права группы и остальных пользователей отменяются:
chmod("hello", S_IRUSR | S_IXUSR);
Те же самые права доступа действуют и в отношении каталогов, но имеют несколько иной смысл. Если у пользователя есть право чтения каталога, то это означает разрешение на получение списка содержимого каталога. Право записи означает возможность добавлять и удалять файлы в каталоге. Пользователь, которому разрешена запись в каталог, может удалять из него файлы даже в том случае, когда у него нет права доступа к этим файлам. Право выполнения применительно к каталогам называется правом поиска. Пользователю. имеющему это право, разрешается входить в каталог и обращаться к его файлам. Если пользователь не может перейти в каталог, то ему не удастся получить доступ к находящимся в нем файлам независимо от их собственных прав доступа.
Подводя итог, рассмотрим, как ядро определяет, имеет ли процесс право обратиться к заданному файлу. Сначала выясняется, кем является пользователь, запустивший процесс: владельцем файла, членом его группы или кем-то другим. В зависимости от категории пользователя проверяется соответствующий набор битов чтения/записи/выполнения и на его основании принимается окончательное решение. [32] Ядро может отклонить запрос на доступ к файлу, если один из каталогов на пути к нему недоступен данному пользователю. Например, если процессу не разрешено обращаться к каталогу /tmp/private , то он не сможет получить доступ к файлу /tmp/private/data .
Интервал:
Закладка: