Завершение процессов. Отличие функции exit от системного вызова _exit . Функция atexit



Процесс может завершиться либо по независящим от него причина, либо по внутренним (возврат из функции man и вызов функции exit)
exit(int status) – аргумент статус возвращается родительском процессу и представляет из себя код возврата программы, закрывает все открытые файлы.
И еще изменяет состояние процесса на зомби, делает процесс init родительским для всех потомков, освобождает адресное пространство процесса,
Кроме передачи кода возврата: выводит буферизированные данные, закрывает потоки ввода/вывода
_ exit – cне производит вызов библиотеки ввода/вывода, сразу вызывает системную функцию завершения ядра

 

Обработчики выходов – функции, которые вызываются после вызова exit но до окончательного завершения процесса(но только если процесс завершается сам, а не по сигналу, например)
atexit( funk) – регестрирует по 32 обработчиков.

 


 

Процессы зомби. Системные вызовы wait и waitpid . Анализ причин завершения процесса.

Операционная система предоставляет процессу ряд системных вызовов, позволяющих ему контролировать выполнение потомков.
wait - он позволяет заблокировать выполнение процесса, пока кто-либо из его непосредственных потомков не прекратит существование. Вызов немедленно возвратит состояние уже завершившегося дочернего процесса в переменной stat_loc, если последний находится в состоянии зомби.
Варианты options:
WIFEXITED - Возвращает истинное (ненулевое) значение, если процесс завершился нормально
WEXITSTATUS - Если WIFEXITED(status) не равно нулю, определяет код возврата завершившегося процесса (аргумент функции exit)
WIFSIGNALLED - Возвращает истину, если процесс завершился по сигналу
WTERMSIG - Если WIFSIGNALLED(status) не равно нулю, определяет номер сигнала, вызвавшего завершение выполнения процесса.
WCOREDUMP - Если WIFSIGNALLED(status) не равно нулю, макрос возвращает истину в случае создания файла core.

waited(idtype, id, stat_loc, options) – тоже самое, но моднее, зависит от параметров
Варианты idtype:
P_PID - блокирует выполнение процесса, следя за потомком, PID которого равен id.
P_PGID - блокирует выполнение процесса, следя за потомками, идентификаторы группы которых равны id
P_ALL - блокирует выполнение процесса, следя за всеми непосредственными потомками.

Варианты options:
WEXITED - Предписывает ожидать завершения выполнения процесса.
WTRAPPED - Предписывает ожидать ловушки (trap) или точки останова (breakpoint) для трассируемых процессов.
WSTOPPED - Предписывает ожидать останова процесса из-за получения сигнала.
WCONTINUED - Предписывает вернуть статус процесса, выполнение которого было продолжено после останова.
WNOHANG - Предписывает завершить свое выполнение, если отсутствует статусная информация (т. е. отсутствует ожидаемое событие).
WNOWAIT - Предписывает получить статусную информацию, но не уничтожать ее, оставив дочерний процесс в состоянии ожидания.

Waitpid(pid, stat_loc, options) – тоже самое, но по PID


Сигналы. Наследование сигналов. Задание обработчика сигнала.

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

К генерации сигнала могут привести разные ситуации:
* ядро оправляет процессу сигнал при нажатии пользователем определенных клавиш
* аппаратные особые ситуации типа деления на 0
* чисто программные ситуации, типа SIGALARM когда срабатывает таймер alarm

Процесс может 1) перехватить и самостоятельно обработать сигнал 2)игнорировать 3)позволить действие по умолчанию

 SIGKILL и SIGSTOP невозможно игнорировать и перехватить.

signal(int sig, disp) позволяет изменить диспозицию сигнала, которая по умолчанию устанавливается ядром UNIX. sig определяет сигнал, диспозицию которого нужно изменить, определяет новую диспозицию сигнала, которой может быть определенная пользователем функция-обработчик или одно из системных значений:
SIG_DFL – указывает, что при получении процессом сигнала необходимо вызвать системный обработчик, т. е. выполнить действие по умолчанию.
SIG_IGN – указывает, что сигнал следует игнорировать
В случае успешного завершения возвращает предыдущую диспозицию.


Порожденный вызовом fork(2) процесс наследует диспозицию сигналов от своего родителя. Однако при вызове ехес(2) диспозиция всех перехватываемых сигналов будет установлена на действие по умолчанию.


 


Дата добавления: 2019-11-25; просмотров: 248; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!