Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zachet-1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
493 Кб
Скачать
☆
  1. Завершение процессов. Отличие функции exit от системного вызова _exit. Функция atexit

exit(main(argc,argv,envp)) возвращаемые параментры main

exit завершает библиотеку ввода-вывода : освобождает всю память, выталкивает

буфера с помощью malloc, проводит некоторые действия, которые нужны в библиотке Си

по завершению программы

Если хотим, чтобы exit вызывал какую-то определенную функцию, то используют

atexit(параметр - указатель на функцию). В самом конце происходит системный вызов

_exit, который вызывает завершение процесса.

В процессе завершения процесса:

1) Разрыв связи между соответствующей функцией и потоками ввода - вывода

2) Для всех открытых файлов освободится место

3) Будет освобождена память, занимаемая данным процессом

Параметр _exit - код возврата.

Процесс перестает существовать после системного вызова exit.

Если в atexit поставить exit произойдет зацикливание.

Функция exit

exit(int main(argc, argv, envp))

1) освобождает память, выделенную malloc’ом

2) сбрасывает буфера ввода/вывода

3) вызывает специальные функции, которые задает пользователь

atexit - параметр - выполнить перед выходом функции.

Если несколько параметров, то первым выполнится последний параметр

int atexit(voud(*function)(void));

_exit вызывается функцией exit

1) разрывает связь между потомками и файлом

2) для всех файлов, у который есть счетчик жестких ссылок = 0, просиходит запись на

диск

3) освобождает занимаемую програмой память

4) сообщает родителю о том, что завершился процесс

Функция exit передает свои параметры в системный вызов _exit

  1. Процессы зомби. Системные вызовы wait и waitpid. Анализ причин завершения процесса. Если родитель завершился до потомка, PPID потомка будет 1

Если потомок завершился раньше, чем родитель сделает wait, то он становится

процессом - зомби, после wait родителя удаляется.

Процесс init после всех своих действий начинает делать wait в цикле.

=> Препятствует образованию процессов — зомби из процессов, чьи родители

завершились раньше.

wait - подождать завершения процесса потомка. Возвращает -1, если ошибка или

возвращает PID потомка.

pid = wait(status)

Если завершается по _exit, то в status записывается код возврата. Если по сигналу, то

номер сигнала. Status - указатель на int.

1) WIFEXITED(status) - возвращает истину, если процесс завершился по _exit, ложь, если

нет.

2) WIFSIGNALED(status) - истина, если завершился по сигналу, ложь - в ином случае.

Процесс может завершиться по изменению своего состояния.

Если WIFEXITED вернул истину, то можно WEXITSTATUS(status) - возвращает код

возврата. Если (2) вернул истину, то WTERMSIG(status) возвращает номер сигнала

/usr/include/sys/wait.h

#include <sys/types.h> #include <wait.h>

pid_t waitpid(pid_t pid, int *status, int options); pid_t wait(int *status);

Системный вызов waitpid() блокирует выполнение текущего процесса до тех пор, пока либо не завершится порожденный им процесс, определяемый значением параметра pid, либо пока текущий процесс не получит сигнал, для которого установлена реакция по умолчанию "завершить процесс" или реакция обработки пользовательской функцией. Если порожденный процесс, заданный параметром pid, к моменту системного вызова находится в состоянии закончил исполнение, системный вызов возвращается немедленно без блокирования текущего процесса.

Параметр pid определяет порожденный процесс, завершения которого дожидается процесс-родитель, следующим образом:

  • Если pid > 0 ожидаем завершения процесса с идентификатором pid.

  • Если pid = 0, то ожидаем завершения любого порожденного процесса в группе, к которой принадлежит процесс-родитель.

  • Если pid = -1, то ожидаем завершения любого порожденного процесса.

  • Если pid < 0, но не –1, то ожидаем завершения любого порожденного процесса из группы, идентификатор которой равен абсолютному значению параметра pid.

Параметр options в нашем курсе может принимать два значения: 0 и WNOHANG. Значение WNOHANG требует немедленного возврата из вызова без блокировки текущего процесса в любом случае. Если системный вызов обнаружил завершившийся порожденный процесс, из числа специфицированных параметром pid, то этот процесс удаляется из вычислительной системы, а по адресу, указанному в параметре status, заносится информация о статусе его завершения. Параметр status может быть задан равным NULL, если эта информация не имеет для нас значения. При обнаружении завершившегося процесса системный вызов возвращает его идентификатор. Если вызов был сделан с установленной опцией WNOHANG, порожденный процесс, специфицированный параметром pid существует, но еще не завершился, то системный вызов вернет значение 0. Во всех остальных случаях он возвращает отрицательное значение. Возврат из вызова, связанный с возникновением обработанного пользователем сигнала, может быть в этом случае идентифицирован по значению системной переменной errno == EINTR, и вызов может быть сделан снова. Системный вызов wait является синонимом для системного вызова waitpid с значениями параметров pid = -1, options = 0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]