Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба4f.doc
Скачиваний:
33
Добавлен:
03.05.2015
Размер:
137.22 Кб
Скачать

Завершение процесса

Завершить процесс можно, послав ему сигнал с помощью утилиты slayилиkillв командной строке, или из программы с помощью таких функций, какkill(), sigqueue()и др.

Завершение процесса выполняется в две стадии

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

  • На второй стадии уничтожаются структура данных о процессе, хранящаяся и операционной системе. Эха стадия выполняется Администратором процессов внутри самого себя.

Процесс, если во время его работы не произошло никаких фатальных сбоев, обычно завершается путем вызова функции exit()или выполнением в функцииmain()оператораreturn. Число, передаваемое при этом в качестве аргумента функцииexit() или с операторомreturn, называют кодам возврата программы. Если программа запускалась из командной строки в интерактивном режиме, то со код возврата можно посмотреть в служебной переменной окружения ?:

echo $?

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

При порождении дочернею процесса с помощью функции spawn*()можно указать флагР_NOWAITO. В лом случае порожденный процесс никогда не сможет стать процессом-*зомби". т. к. Администратор процессов не будет хранить код возврата. Соответственно, нельзя будет использовать функцииwait()для получения кода возврата. Существует функцияaiexilf() позволяющая зарегистрировать для процесса функции-деструкторы, т.е. функции, вызываемые при нормальном завершении процесса непосредственно перед завершением. Таких деструкторов можно зарегистрировать 32 штуки, причем вызываться они будут в порядке LIFO ("Last In First Out", т. e. последняя зарегистрированная функция-деструктор будет вызвана первой).

Получение информации о процессах

Для быстрого получения информации о текущем состоянии процессов и потоков в Neutrino используют несколько утилит:

  • ps— основная POSlX-угилита для мониторинга процессов. Она включена в QNX ках для совместимости POSIX. гак и для удобства администраторов, недавно работающих BQNX:

  • sin— весьма информативная QNX-утилита мониторинга процессов С помощью sin можно, задав соответствующую опцию, получить информацию о процессах на другом узле сети. По умолчанию sin выдает для каждого процесса следующую информацию PID, размер кода, размер стека и использование процессора. С помощью аргументов-команд можно получить дополнительную информацию:

argsаргументы процессов;

cpu— использование ЦПУ.

env— переменные окружения процессов:

fdsоткрытые файловые дескрипторы,

flags— флаги процессов;

infoобщую информацию о системе;

memoryпамять, используемую процессами;

netинформацию об узлах сети:

registers состояние регистров;

signals—сигнальные маски.

threads- информацию по потокам:

tincrsтаймеры, установленные процессами;

users— реальные и эффективные идентификаторы владельцев и групп процессов

Для выполнения команд достаточно ввести первые два символа, например команда sin flagsравнозначна командеsin flags. У утилитыsinесть вариант с графическим интерфейсом — утилитаpsin

pidin— эта утилита появилась в QNX только с 6ой версии и предназначена для получения детальной информации о потоках.