
Завершение процесса
Завершить процесс можно, послав ему сигнал с помощью утилиты 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ой версии и предназначена для получения детальной информации о потоках.