Системные вызовы семейства exec

Содержание

Слайд 2

Прототипы функций (1) int execl(const char *, const char *, …);

Прототипы функций (1)
int execl(const char *,
const char *, …);
int execlp(const char

*,
const char *, …);
int execle(const char *,
const char *, …, char * const[]);
Слайд 3

Прототипы функций (2) int execv(const char *, char * const[]); int

Прототипы функций (2)
int execv(const char *,
char * const[]);
int execvp(const char *,
char

* const[]);
int execve(const char *,
char * const[], char * const[]);
Слайд 4

execl() Список параметров Строго задается абсолютное либо относительное имя Окружение сохраняется

execl()

Список параметров
Строго задается абсолютное либо относительное имя
Окружение сохраняется

Слайд 5

execlp() Список параметров Поиск программы осуществляется в соответствии с переменной окружения PATH Окружение сохраняется

execlp()

Список параметров
Поиск программы осуществляется в соответствии с переменной окружения PATH
Окружение сохраняется

Слайд 6

execle() Список параметров Строго задается абсолютное либо относительное имя Окружение копируется из параметров системного вызова

execle()

Список параметров
Строго задается абсолютное либо относительное имя
Окружение копируется из параметров системного

вызова
Слайд 7

execv() Вектор параметров Строго задается абсолютное либо относительное имя Окружение сохраняется

execv()

Вектор параметров
Строго задается абсолютное либо относительное имя
Окружение сохраняется

Слайд 8

execvp() Вектор параметров Поиск программы осуществляется в соответствии с переменной окружения PATH Окружение сохраняется

execvp()

Вектор параметров
Поиск программы осуществляется в соответствии с переменной окружения PATH
Окружение сохраняется

Слайд 9

execve() Вектор параметров Строго задается абсолютное либо относительное имя Окружение копируется из параметров системного вызова

execve()

Вектор параметров
Строго задается абсолютное либо относительное имя
Окружение копируется из параметров системного

вызова
Слайд 10

Семейство функций exec()

Семейство функций exec()

Слайд 11

main int main(int argc, char * argv[], char * envp[]); argc

main

int main(int argc, char * argv[], char * envp[]);
argc – количество

аргументов командной строки
argv – вектор аргументов командной строки
envp – вектор окружения
Слайд 12

Окружение процесса Набор текстовых строк вида: переменная=значение Обычно используются для передачи текстовой информации между процессами.

Окружение процесса

Набор текстовых строк вида:
переменная=значение
Обычно используются для передачи текстовой информации между

процессами.
Слайд 13

Переменные окружения

Переменные окружения


Слайд 14

Переменные окружения PATH – пути поиска исполнимых файлов HOME – домашний

Переменные окружения
PATH – пути поиска исполнимых файлов
HOME – домашний каталог пользователя
PS1

– приглашение Shell
TERM – тип терминала
Слайд 15

Системные вызовы (1) char * getenv(const char * name); вернуть значение

Системные вызовы (1)

char * getenv(const char * name);
вернуть значение переменной
int putenv(char

* string);
поместить строку в окружение,
параметр string станет частью
окружения процесса
Слайд 16

Системные вызовы (2) int setenv(const char * name, const char *

Системные вызовы (2)

int setenv(const char * name,
const char * value, int

overwrite);
добавить / изменить значение
переменной окружения
int unsetenv(const char * name);
удалить переменную
Слайд 17

Системные вызовы (3) int clearenv(); полностью очистить окружение – глобальная переменная environ получит значение NULL

Системные вызовы (3)
int clearenv();
полностью очистить окружение –
глобальная переменная environ
получит значение NULL

Слайд 18

Идентификаторы пользователя uid – реальный идентификатор пользователя euid – эффективный идентификатор

Идентификаторы пользователя

uid – реальный идентификатор пользователя
euid – эффективный идентификатор пользователя
suid –

сохраненный идентификатор пользователя
Слайд 19

uid Определяет «истинного» владельца процесса, того на чей счет относятся потребляемые процессом ресурсы.

uid

Определяет «истинного» владельца процесса, того на чей счет относятся потребляемые

процессом ресурсы.
Слайд 20

euid Определяет права доступа к объектам системы (файлы (особенности Linux), процессы, IPC-средства.

euid

Определяет права доступа к объектам системы (файлы (особенности Linux), процессы,

IPC-средства.
Слайд 21

suid Предоставляет возможность переключения euid между значениями uid и suid.

suid

Предоставляет возможность переключения euid между значениями uid и suid.

Слайд 22

В большинстве случаев все идентификаторы процесса, связанные с пользователями – uid,

В большинстве случаев все идентификаторы процесса, связанные с пользователями –

uid, euid и suid совпадают.
Если не совпадают, то это suid-программа.
Слайд 23

При выполнении exec Если на запускаемый исполнимый файл (не скрипт) установлен

При выполнении exec

Если на запускаемый исполнимый файл (не скрипт) установлен

бит смены идентификатора пользователя (suid-бит), то euid и suid процесса устанавливаются в uid владельца данного файла.
Слайд 24

Наследование пользовательских идентификаторов

Наследование пользовательских идентификаторов


Слайд 25

Файл -rwsr-xr-x 1 max group 3765 Jan 19 20:45 prog1 Процесс

Файл
-rwsr-xr-x 1 max group 3765 Jan 19 20:45 prog1
Процесс до

exec
uid=579 (user), euid=579 (user), suid=579 (user)
Процесс после exec(“prog1”, …)
uid=579 (user), euid=521 (max), suid=521 (max)
Слайд 26

Системные вызовы int getuid(); - получить uid int geteuid(); - получить

Системные вызовы

int getuid(); - получить uid
int geteuid(); - получить euid
int

setuid(int); - установить uid, euid, suid в одно значение
int seteuid(int); - установить euid
Слайд 27

Программы, использующие suid-бит su sudo passwd mount umount ping traceroute

Программы, использующие suid-бит

su
sudo
passwd
mount
umount
ping
traceroute

Слайд 28

Сигналы

Сигналы


Слайд 29

Назначение сигналов Простейший способ межпроцессного взаимодействия. Предназначены для информирования процесса о наступлении какого-либо события.

Назначение сигналов

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

события.
Слайд 30

Надежные и ненадежные Отправка сигнала Доставка сигнала

Надежные и ненадежные
Отправка сигнала
Доставка сигнала

Слайд 31

Свойства сигналов Уникальный номер (обычно в диапазоне от 1 до 32)

Свойства сигналов

Уникальный номер (обычно в диапазоне от 1 до 32) (номера

больше 32 используются для сигналов реального времени)
Уникальное имя (определено в файле signal.h) (kill -l)
Слайд 32

Причины отправки По инициативе процесса – системный вызов int kill(int, int); По инициативе ядра

Причины отправки

По инициативе процесса – системный вызов
int kill(int, int);
По инициативе ядра

Слайд 33

По инициативе ядра Нажатие на управляющем терминале определенных клавиш (драйвер терминала)

По инициативе ядра

Нажатие на управляющем терминале определенных клавиш (драйвер терминала)
Аппаратные особые

ситуации
Программные состояния (будильники)
Слайд 34

Доставка сигнала (диспозиция) По умолчанию (обычно завершение процесса с созданием или

Доставка сигнала (диспозиция)

По умолчанию (обычно завершение процесса с созданием или без

создания core-файла)
Игнорирование сигнала
Перехват сигнала (вызов собственного обработчика)
Слайд 35

Когда core-файл не создается Исполняемый файл процесса имеет установленный suid-бит и

Когда core-файл не создается

Исполняемый файл процесса имеет установленный suid-бит и реальный

владелец процесса не совпадает с владельцем файла
Нет права записи в текущий каталог процесса
Размер core-файла превышает лимит
Слайд 36

Диспозиция по умолчанию Процесс завершается (переходит в состояние зомби) и в

Диспозиция по умолчанию

Процесс завершается (переходит в состояние зомби) и в младший

байт статуса завершения записывается номер сигнала.
Слайд 37

Перехват сигнала Системный вызов void (*signal(int sig, void (*disp)(int))) (int); Функция-обработчик void disp(int sig);

Перехват сигнала


Системный вызов
void (*signal(int sig, void (*disp)(int))) (int);
Функция-обработчик
void disp(int sig);

Слайд 38

Сигналы (1) SIGKILL (9) SIGSTOP SIGCONT

Сигналы (1)

SIGKILL (9)
SIGSTOP
SIGCONT

Слайд 39

Сигналы (2) SIGINT (2) SIGQUIT (3) SIGTSTP SIGTTIN SIGTTOU

Сигналы (2)

SIGINT (2)
SIGQUIT (3)
SIGTSTP
SIGTTIN
SIGTTOU

Слайд 40

Сигналы (3) SIGBUS SIGSEGV SIGFPE SIGILL SIGSYS

Сигналы (3)
SIGBUS
SIGSEGV
SIGFPE
SIGILL
SIGSYS

Слайд 41

Сигналы (4) SIGHUP (1) SIGTERM (15)

Сигналы (4)

SIGHUP (1)
SIGTERM (15)

Слайд 42

SIGPIPE Сигнал посылается процессу при некорректной работе с каналом или сокетом.

SIGPIPE

Сигнал посылается процессу при некорректной работе с каналом или сокетом.
Более подробно

будет рассмотрен в теме «каналы».
Слайд 43

SIGCHLD Сигнал посылается процессу-родителю при завершении любого из его сыновей. Явное

SIGCHLD

Сигнал посылается процессу-родителю при завершении любого из его сыновей.
Явное игнорирование сигнала

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

SIGUSR1, SIGUSR2 Нет специального действия, закрепленного за этими сигналами. Поэтому процессы

SIGUSR1, SIGUSR2


Нет специального действия, закрепленного за этими сигналами. Поэтому процессы могут

использовать их для взаимной синхронизации.
Слайд 45

SIGALRM Процесс может с помощью системного вызова alarm() зарегистрировать будильник. По

SIGALRM


Процесс может с помощью системного вызова alarm() зарегистрировать будильник. По истечении

заданного времени процессу будет послан данный сигнал.
Слайд 46

Надежные сигналы Дополнительные возможности: Блокирование доставки сигнала Рекурсивная обработка Получение дополнительной

Надежные сигналы

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

блокирующими системными вызовами
Слайд 47

Множество сигналов Специальный тип sigset_t Внутренняя реализация этого типа не документируется (обработка с помощью специальных функций).

Множество сигналов

Специальный тип
sigset_t
Внутренняя реализация этого типа не документируется (обработка с помощью

специальных функций).
Слайд 48

Библиотечные функции int sigemptyset(sigset_t *); int sigfillset(sigset_t *); int sigaddset(sigset_t *,

Библиотечные функции


int sigemptyset(sigset_t *);
int sigfillset(sigset_t *);
int sigaddset(sigset_t *, int);
int sigdelset(sigset_t *,

int);
int sigis member(sigset_t *, int);
Слайд 49

Управление маской сигналов int sigprocmask(int how, sigset_t * set, sigset_t * oset); how SIG_BLOCK SIG_UNBLOCK SIG_SETMASK

Управление маской сигналов

int sigprocmask(int how,
sigset_t * set, sigset_t * oset);
how
SIG_BLOCK
SIG_UNBLOCK
SIG_SETMASK

Слайд 50

Работа с сигналами int sigpending(sigset_t *); получение сигналов, ожидающих доставки int

Работа с сигналами

int sigpending(sigset_t *);
получение сигналов, ожидающих доставки
int sigsuspend(sigset_t *);
int pause();
ожидание

сигналов
Слайд 51

Работа с диспозицией int sigaction(int sig, const struct sigaction * act, struct sigaction * oact);

Работа с диспозицией


int sigaction(int sig,
const struct sigaction * act,
struct sigaction *

oact);
Слайд 52

Структура sigaction void (* sa_handler) () void (* sa_sigaction) (int, siginfo_t

Структура sigaction

void (* sa_handler) ()
void (* sa_sigaction) (int,
siginfo_t *, void *)
sigset_t

sa_mask
int sa_flags
Слайд 53

Флаги sa_flags SA_SIGINFO SA_RESETHAND (SA_ONESHOT) SA_NODEFER SA_RESTART

Флаги sa_flags

SA_SIGINFO
SA_RESETHAND (SA_ONESHOT)
SA_NODEFER
SA_RESTART

Слайд 54

Доставка и обработка сигнала Вызов функции ядра issig() от имени процесса

Доставка и обработка сигнала

Вызов функции ядра issig() от имени процесса приводит

к действию по умолчанию или вызову функции sendsig(), запускающей обработчик сигнала. При этом обработчик выполняется в режиме задачи.
Слайд 55

Функция ядра issig() (1) При возврате из режима ядра в режим

Функция ядра issig() (1)

При возврате из режима ядра в режим задачи

после обработки системного вызова или прерывания
Перед переходом процесса в состояние сна с приоритетом допускающим прерывание сигналом
Слайд 56

Функция ядра issig() (2) После пробуждения от сна с приоритетом, допускающим прерывание сигналом

Функция ядра issig() (2)
После пробуждения от сна с приоритетом, допускающим прерывание

сигналом
Слайд 57

Группы и сеансы

Группы и сеансы


Слайд 58

Группы и сеансы (1) Идентификаторы pgid – идентификатор группы процессов (не

Группы и сеансы (1)

Идентификаторы
pgid – идентификатор группы процессов (не путать с

gid)
sid – идентификатор сеанса (сессии)
Слайд 59

Группы и сеансы (2) Каждый сеанс включает одну или несколько групп.

Группы и сеансы (2)

Каждый сеанс включает одну или несколько групп. Не

может группа включать процессы из разных сеансов. Лидер группы (сеанса) – процесс, у которого pid совпадает с pgid (sid). Сеанс может иметь управляющий терминал. Толька одна группа сеанса текущая.
Слайд 60

Группы и сеансы (3) Если происходит зависание терминала, то лидеру сеанса

Группы и сеансы (3)

Если происходит зависание терминала, то лидеру сеанса посылается

сигнал SIGHUP.
Если умирает лидер сеанса, то все процессы текущей группы получают сигнал SIGHUP.
Читать с терминала могут только процессы текущей группы.
Слайд 61

Системные вызовы (группы) pid_t getpgrp(); pid_t getpgid(pid_t); int setpgrp();

Системные вызовы (группы)

pid_t getpgrp();
pid_t getpgid(pid_t);
int setpgrp();

Слайд 62

Системные вызовы (сеансы) pid_t getsid(pid_t); pid_t setsid();

Системные вызовы (сеансы)


pid_t getsid(pid_t);
pid_t setsid();

Слайд 63

Текущие и фоновые группы, управляющий терминал

Текущие и фоновые группы, управляющий терминал

Слайд 64

Листинг ps

Листинг ps

Слайд 65

Процессы-демоны

Процессы-демоны


Слайд 66

Демоны Специальные системные процессы работающие длительное время, не связанные с терминалами.

Демоны

Специальные системные процессы работающие длительное время, не связанные с терминалами. Управление

обычно осуществляется при помощи сигналов. В крайнем случае убить и запустить заново с другими параметрами.
Слайд 67

init Самый главный процесс в системе. pid=1 Является отцом всех осиротевших

init

Самый главный процесс в системе. pid=1 Является отцом всех осиротевших процессов.

Активно работает в момент начальной загрузки системы и при переходе с уровня на уровень. В остальное время спит. Смерть init приводит к состоянию kernel panic.
Слайд 68

Последовательность шагов (1) Снять ассоциацию с управляющим терминалом (Демон не должен

Последовательность шагов (1)

Снять ассоциацию с управляющим терминалом (Демон не должен получать

SIGHUP от терминала)
Закрыть все открытые файлы (Демон может выводить сообщения только через syslog)
Слайд 69

Последовательность шагов (2) Сменить текущий каталог на корневой (Демон не должен

Последовательность шагов (2)

Сменить текущий каталог на корневой (Демон не должен мешать

размонтированию файловых систем)
Выполнить fork, родительский процесс exit, код в тело дочернего процесса (ppid = 1)
Слайд 70

Последовательность шагов (3) Установить необходимые обработчики сигналов (Демон обычно управляется сигналами SIGHUP, SIGTERM, SIGUSR1)

Последовательность шагов (3)

Установить необходимые обработчики сигналов (Демон обычно управляется сигналами SIGHUP,

SIGTERM, SIGUSR1)