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

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

• 

SIGALARM
и системный вызов
alarm
предоставляют низкоуровневый механизм для уведомления о прошествии определенного числа секунд,
pause
приостанавливает процесс, пока не появятся какие-нибудь сигналы,
sleep
использует их для помещения процесса в спящее состояние на заданный период времени:
sleep
и
alarm
не должны использоваться вместе. Сама
pause
создает состояние гонки; вместо этого нужно использовать блокирование сигналов и
sigsuspend
.

• Сигналы управления заданиями реализуют управление заданиями для оболочки. Большую

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

• Перехват

SIGCHLD
позволяет родителю узнать, что делает порожденный им процесс. Использование '
signal(SIGCHLD, SIG_IGN)
' (или
sigaction
с
SA_NOCLDWAIT
) вообще игнорирует потомков. Использование
sigaction
с
SA_NOCLDSTOP
предоставляет уведомления лишь о завершении. В последнем случае, независимо от того, заблокирован
SIGCHLD
или нет, обработчики сигналов для
SIGCHLD
должны быть готовы немедленно обработать несколько потомков. Наконец, использование
sigaction
без
SA_NOCLDSTOP
с обработчиком сигналов с тремя аргументами дает вам причину получения сигнала.

• После

fork
положение сигналов в порожденном процессе остается тем же самым, за исключением сброса ожидающих сигналов и установленных интервалов таймера. После
exec
положение несколько более сложно — в сущности, все, что может быть оставлено, остается; для всего остального восстанавливаются значения по умолчанию.

Упражнения

1. Реализуйте

bsd_signal
с использованием
sigaction
.

2. Если у вас не установлен GNU/Linux, запустите на своей системе

ch10-catchint
. Является ли ваша система традиционной или BSD?

3. Реализуйте функции System V Release 3

sighold
,
sigrelse
,
sigignore
,
sigpause
и
sigset
, использовав
sigaction
и другие подходящие функции из POSIX API.

4. Потренируйте свои навыки в жонглировании битами. В предположении, что сигнал 0 отсутствует и что имеется не более 31 сигналов, предусмотрите

typedef
для
sigset_t
и напишите
sigemptyset
,
sigfillset
,
sigaddset
,
sigdelset
и
sigismember
.

5. Еще немного потренируйте свои навыки жонглирования битами. Повторите предыдущее упражнение, на этот раз предположив, что наибольшим сигналом является 42.

6. Теперь, когда вы сделали предыдущие два упражнения, найдите

sigemptyset
и др. в своем заголовочном файле
<signal.h>
. (Может потребоваться поискать их; они могут быть в
#include
файлах, указанных в
<signal.h>
.) Являются ли они макросами или функциями?

7. В разделе 10.7 «Сигналы для межпроцессного взаимодействия» мы упомянули, что код изделия должен работать с начальной маской сигналов процесса, добавляя и удаляя блокируемые сигналы в вызове

sigsuspend
. Перепишите пример, используя для этого соответствующие вызовы.

8. Напишите свою собственную версию команды

kill
. Интерфейс должен быть таким:

kill [-s имя-сигнала] pid ...

Если

сигнал не указан, программа должна посылать
SIGTERM
.

9. Как вы думаете, почему в современных оболочках, таких, как Bash и ksh93,

kill
является встроенной командой?

10. (Трудное) Реализуйте

sleep
, используя
alarm
,
signal
и
pause
. Что случится, если обработчик сигнала для
SIGALRM
уже установлен?

11. Поэкспериментируйте с

ch10-reap.c
, изменяя интервал времени, на который засыпает каждый потомок, и организуя достаточное число вызовов
sigsuspend
для сбора сведений о всех потомках.

12. Попробуйте заставить

ch10-reap2.c
испортить информацию в
kids
,
nkids
и
kidsleft
. Теперь добавьте вокруг критического раздела блокирование/разблокирование и посмотрите, есть ли разница.

Глава 11

Права доступа и ID пользователей и групп

Linux, вслед за Unix, является многопользовательской системой. В отличие от большинства операционных систем для персональных компьютеров, [114] в которых имеется лишь один пользователь и в которых, кто бы ни находился перед компьютером, он имеет полный контроль, Linux и Unix различают файлы и процессы по владельцам и группам, которым они принадлежат. В данной главе мы исследуем проверку прав доступа и рассмотрим API для получения и установки идентификаторов владельцев и групп.

114

MacOS X и Windows XP обе являются многопользовательскими системами, но это довольно недавние разработки — Примеч. автора.

11.1. Проверка прав доступа

Как мы видели в разделе 5.4.2 «Получение информации о файлах», файловая система хранит идентификаторы владельца и группы файла в виде числовых значений; это типы

uid_t
и
gid_t
соответственно. Для краткости мы используем для «идентификатора владельца (пользователя)» и «идентификатора группы» сокращения UID и GID соответственно.

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

Помимо файлов, UID определяет, как один процесс может повлиять на другой путем посылки сигналов. Сигналы описаны в главе 10 «Сигналы».

Наконец, особым случаем является суперпользователь,

root
.
root
идентифицируется по UID, равным 0. Когда у процесса UID равен 0, ядро позволяет ему делать все, что он захочет: читать, записывать или удалять файлы, посылать сигналы произвольным процессам и т.д. (POSIX в этом отношении более непонятный, ссылаясь на процессы с «соответствующими привилегиями». Этот язык, в свою очередь, просочился в справочные страницы GNU/Linux и справочное руководство GLIBC online Info manual. Некоторые операционные системы действительно разделяют привилегии пользователей, и Linux также движется в этом направлении. Тем не менее, в настоящее время «соответствующие привилегии» означает просто процессы с UID, равным 0.)

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

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Лорд Системы 11

Токсик Саша
11. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 11

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

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

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Расческа для лысого

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
8.52
рейтинг книги
Расческа для лысого

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

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

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Ярость Богов

Михайлов Дем Алексеевич
3. Мир Вальдиры
Фантастика:
фэнтези
рпг
9.48
рейтинг книги
Ярость Богов

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

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

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

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...