Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_ПСРВ.doc
Скачиваний:
26
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

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

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

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

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

  • args — показать аргументы процессов;

  • ери — показать использование ЦПУ;

  • env — показать переменные окружения процессов;

  • fds — показать открытые файловые дескрипторы;

  • flags — показать флаги процессов;

  • info — показать общую информацию о системе;

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

  • net — показать информацию об узлах сети;

  • registers — показать состояние регистров;

  • signals — показать сигнальные маски;

  • threads — показать информацию по потокам;

  • timers — показать таймеры, установленные процессами;

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

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

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

2. Упражнения

УПРАЖНЕНИЕ 2.1.

Ознакомиться с методическими указаниями к выполнению практической работы. Написать, отладить программу и получить результаты её выполнения.

УПРАЖНЕНИЕ 2.2.

Включить в программу средства для индикации выполнения процессов и продемонстрировать их.

УПРАЖНЕНИЕ 2.3.

Сымитировать ошибочную ситуацию и вывести значение переменной errno и её смысл.

3. Содержание отчёта

  1. Номер, название и цель работы.

  2. Текст программы.

  3. Результат выполнения упражнений 2.1-2.3.

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №16

Организация синхронизации процессов вQNX.

Разработка мультипроцессных приложений

Цель – освоение функций ОС для запуска параллельных процессов и организации межпроцессного взаимодействия посредством сообщений

1. Краткие теоретические сведения

Обмен сообщениями предполагает клиент\серверное взаимодействие.

1.1. Сервер. Создание канала

Подразумевается, что сервер должен создать канал – то, к чему присоединялся клиент, когда вызывал функцию ConnectAttach(). Обычно сервер, однажды создав канал, приберегает его «впрок».

Канал создается с помощью функции ChannelCreate().

#include <sys/neutrino.h>

int ChannelCreate (unsigned flags);

Пока на данном этапе будем использовать для параметра flags значение 0 (ноль).

Таким образом, для создания канала сервер должен сделать так:

int chid;

chid = ChannelCreate (0);

Теперь у нас есть канал. В этом пункте клиенты могут подсоединиться (с помощью функции ConnectAttach()) к этому каналу и начать передачу сообщений).

Сервер отрабатывает схему сообщений обмена в два этапа – этап «приема» (receive) и этап «ответа» (reply).

#include <sys/neutrino.h>

int MsgReceive (int chid, void *rmsg, int rbytes, struct _msg_infо *info);

int MsgReply (int rcvid, int status, const void *msg, int nbytes);

Применение обмена сообщениями:

  1. Клиент вызывает функцию MsgSend() и указывает ей на буфер передачи (указателем smsg и длиной sbytes).

  2. Данные передаются в буфер функции MsgReceive() на стороне сервера, по адресу rmsg и длиной rbytes. Клиент блокируется.Функция MsgReceive() сервера разблокируется и возвращает идентификатор отправителя rcvid, который будет впоследствии использован для ответа. Теперь сервер может использовать полученные от клиента данные.

  3. Сервер завершил обработку сообщения и теперь использует идентификатор отправителя rcvid, полученный от функции MsgReceive(), передавая его функции MsgReply(). Заметьте, что местоположение данных для передачи функции MsgReply() задается как указатель на буфер (smsg) определенного размера (sbytes). Ядро передает данные клиенту.

  4. Наконец, ядро передает параметр sts, который используется функцией MsgSend() клиента как возвращаемое значение. После этого клиент разблокируется.

Для каждой буферной передачи указываются два размера (в случае запроса от клиента это sbytes на стороне клиента и rbytes на стороне сервера; в случае ответа сервера это sbytes на стороне сервера и rbytes на стороне клиента). Это сделано для того, чтобы разработчики каждого компонента смогли определить размеры своих буферов – из соображений дополнительной безопасности.

Канал уничтожается с помощью функции ChannelDestroy():

#include <sys/neutrino.h>

int ChannelDestroy (int chid);