Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Идентификаторы процессов, группы процессов и сеансы

Каждому процессу соответствует положительное число, которое называется идентификатором процесса и всегда является уникальным. У каждого процесса кроме одного есть родитель.

Системные данные процесса включают также идентификатор его родительского процесса. Иногда программисты решают реализовать какую-либо подсистему как группу родственных процессов, а не как один процесс. Ядро Unix позволяет организовать эти родственные процессы в группу процессов. Группы процессов далее организуются в сеансы. Одним из членов сеанса является лидер сеанса, а одним из членов каждой группы процессов – лидер группы процессов. Чтобы каждый процесс мог узнать свое место в иерархии, Unix следит за идентификаторами лидера его группы процессов и лидера его сеанса.

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

Любой процесс может выйти из сеанса и стать лидером собственного сеанса. Затем он может создать дочерние процессы, сформировав новую полноценную группу процессов. В сеансе можно сформировать дополнительные группы процессов, а разным группам назначить имеющиеся процессы. Следовательно, один пользователь может выполнять, например, сеанс из 10 процессов, организованных в три группы.

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

С каждым процессом связаны четыре идентификатора процесса:

  • идентификатор процесса: положительное число, однозначно идентифицирующее процесс;

  • идентификатор родительского процесса;

  • идентификатор группы процессов: идентификатор процесса, являющегося лидером группы процессов. Если он равен идентификатору процесса, то данный процесс является лидером группы;

  • идентификатор лидера сеанса.

    1. Система прав

Идентификатор пользователя (user-ID) – это положительное число, ассоциированное с регистрационным именем (login name) пользователя в файле паролей. Когда пользователь входит в систему, команда login делает этот идентификатор идентификатором пользователя первого создаваемого процесса – регистрационной оболочки. Процессы, дочерние по отношению к оболочке, наследуют этот идентификатор пользователя.

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

Группы определяются в файле групп (/etc/group). Войдя в систему, пользователь может переключится на другую группу, членом которой он является. При этом изменяется идентификатор группы, связанный с обрабатывающим запрос процессом, а все производные процессы наследуют этот идентификатор. Так как пользователь может быть членом нескольких групп, процесс также имеет ряд дополнительных идентификаторов групп. Как правило, при проверке прав, связанных с группой процесса, эти идентификаторы также учитываются, так что пользователям не приходится постоянно изменять группы вручную.

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

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

Таблица 1.1. Биты прав доступа к файлам.

Бит

Описание

8

владелец имеет право читать файл

7

владелец имеет право записывать файл

6

владелец имеет право выполнение файла

5

члены группы имеют право читать файл

4

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

3

члены группы имеют право на выполнение файла

2

другие пользователи имеют право читать файл

1

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

0

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

Биты прав доступа часто задаются с использованием восьмеричного числа. Например, восьмеричное 775 предоставляет владельцу и членам группы права на чтение, запись и выполнение файла, а другим пользователям – права на его чтение и выполнение, но не на запись. Команда ls отобразила бы эту комбинацию прав как rwxrwxr-x, что в двоичной форме предоставляется как число 111111101, легко преобразуемое в восьмеричное 775.

Система прав определяет, может ли конкретный процесс прочитать, записать или выполнить конкретный файл. В случае обычных файлов смысл этих операций очевиден. Право на чтение каталога также не требует пояснений. Под правом «на запись» каталога понимают возможность выполнения системного вызова, изменяющего каталог (добавляющего или удаляющего связь), а под правом «на выполне команды ние» каталога (которое иногда называют правом «на поиск») – возможность включить каталог в путь. Права на чтение и запись специальных файлов определяют возможность выполнения системных вызовов чтения и записи. Что это означает – зависит от разработчика драйвера устройства. Право на выполнение специального файла не имеет смысла.

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

  1. Если действующий идентификатор пользователя равен нулю, право предоставляется сразу (действующий пользователь является суперпользователем).

  2. Если используемый процессом действующий идентификатор пользователя соответствует идентификатору пользователя файла, для определения допустимости операции используется набор битов владельца.

  3. Если используемый процессом действующий идентификатор группы или один из дополнительных идентификаторов групп соответствует групповому идентификатору файла, используется набор битов группы.

  4. Если ни идентификаторы пользователей, ни идентификаторы групп не позволяют обратиться к файлу, система приходит к выводу, что процесс выполняется «другим» пользователем, и использует третий набор битов.

Эти этапы выполняются в указанном порядке, так что если на третьем этапе система запретит запись файла из-за того, что группа не обладает нужным правом, процесс не сможет записать файл, даже если другие пользователи обладают таким правом.

Иногда требуется временно назначить пользователю права другого пользователя. Например, при выполнении команды passwd для изменения пароля нам хотелось бы сделать действующим идентификатором пользователя идентификатор суперпользователя, потому что только он может записывать данные в файл паролей. Для этого достаточно сделать пользователя root (регистрационное имя суперпользователя) владельцем команды passwd (обычного файла, содержащего программу passwd), после чего установить в индексном узле команды passwd другой бит, называемый битом установки идентификатора пользователя. Если этот бит, установлен, при выполнении программы действующий идентификатор пользователя изменяется на идентификатор владельца файла, содержащего программу. Так как права определяет действующий идентификатор, а не реальный, это позволяет пользователю временно получить права кого-то другого. Бит установки идентификатора группы используется подобным образом.

Дочерний процесс наследует от родительского оба идентификатора пользователя, поэтому благодаря возможности установки идентификатора пользователя можно долго работать с другим действующим идентификатором пользователя. Именно это делает команда su.