Завершение процессов. Отличие функции 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!