O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Функция do_exit()

Mar-25-2012 By root

Любое завершение процесса выполняется функцией do exit (), которая удаляет большинство ссылок на завершающийся процесс из структур данных ядра.

Функция do exit () принимает в качестве параметра код завершения процесса и выполняет следующие действия:

1. Устанавливает флаг pf exiting в поле flag дескриптора процесса, чтобы отметить тот факт, что процесс в данный момент удаляется.

2. Удаляет, если необходимо, дескриптор процесса из очереди динамического таймера, для чего вызывает функцию dei timer sync ().

3. Отсоединяет от дескриптора процесса структуры, имеющие отношение к выделению страниц, семафорам, файловой системе, дескрипторам открытых файлов, пространствам имен и битовой карте разрешений ввода/вывода, вызывая С ЭТОЙ целью функции exit_mm(), exit_sem(), exit_f iles (), exit_f s (), exit_namespace () и exit_thread () соответственно. Эти же функции удаляют перечисленные структуры, если другие процессы не пользуются ими совместно с уничтожаемым процессом.

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

5. Записывает код завершения процесса в поле exit code дескриптора процесса. Это значение представляет собой либо параметр системного вызова

exit о или exit groupO (нормальное завершение), либо код ошибки, предоставленный ядром (аварийное завершение).

6. Вызывает функцию exit notifyO, которая выполняет следующие действия:

•обновляет отношения родитель – потомок”между соответствующими процессами. Все потомки, созданные уничтожаемым процессом, становятся потомками другого процесса в той же группе потоков, если таковой в данный момент выполняется. В противном случае они становятся потомками процесса init;

•убеждается, что поле exit signai дескриптора уничтожаемого процесса отлично от – 1, и что этот процесс является последним членом своей группы потоков (заметим, что эти условия всегда соблюдены у любого нормального процесса; см. шаг 16 в описании функции copy process о ранее в этой главе). В этом случае функция посылает сигнал (обычно sigchld) родителю уничтожаемого процесса, чтобы известить его о гибели”потомка;

•в противном случае, т. е. если поле exit signai содержит – 1, или группа потоков включает в себя другие процессы, функция отправляет сигнал sigchld родителю только в том случае, когда процесс отслеживается (в этой ситуации родителем является отладчик, который информируется о гибели”облегченного процесса);

•если поле exit signai дескриптора процесса равно – 1, а процесс не отслеживается, функция записывает в поле exit state дескриптора процесса значение exit dead и вызывает функцию reiease tasko для утилизации памяти, занимаемой оставшимися структурами данных процесса, и уменьшения счетчика обращений дескриптора процесса (см. следующий раздел). Счетчик обращений становится равным, так что сам дескриптор процесса пока не удаляется;

•если же поле exit signai дескриптора процесса не равно – 1, а процесс отслеживается, функция записывает в поле exit state значение exit zombie. В следующем разделе мы увидим, что происходит с про – цессами – зомби;

•устанавливает флаг pf dead в поле flags дескриптора процесса.

7. Вызывает функцию schedule о, чтобы выбрать, какой процесс будет выполняться следующим. Поскольку процесс в состоянии exit zombie игнорируется планировщиком, выполнение процесса прекращается сразу после вызова макроса switchto в функции schedule о. Как планировщик проверит флаг pf dead и уменьшит счетчик обращений в дескрипторе процесса – зомби, замещаемого другим процессом, чтобы отметить тот факт, что процесс больше не существует.

Add A Comment