Обычный прием распознавания прокси-сообщений QNX4 (полученных с помощью
Если вы сравниваете полученный от функции приема идентификатор процесса со списком ожидаемых идентификаторов прокси, обычно вы игнорируете содержимое прокси. В конце концов, коль скоро содержимое прокси нельзя изменить после ее создания, какой прок с анализа сообщения, о котором вы уже знаете, что это одна из ваших прокси? Вы можете возразить, что это для удобства — помещаем в прокси нужные сообщения, а затем обрабатываем все сообщения одним стандартным декодером. Если это ваш случай, см. ниже «Анализ прокси по содержимому».
Поэтому, в QNX4 ваш код выглядел бы примерно так:
pid = Receive(0, &msg, sizeof(msg));
if (pid == proxyPidTimer) {
// Сработал наш таймер, сделать что-нибудь
} else if (pid == proxyPidISR) {
// Сработал наш ISR, сделать что-нибудь
} else {
// Не наша прокси — возможно, обычное
// клиентское сообщение. Сделать что-нибудь.
}
В QNX/Neutrino он заменился бы на следующий:
rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
if (rcvid == 0) { // 0 значит, что это импульс
switch (msg.pulse.code) {
case MyCodeTimer:
// Сработал наш таймер, сделать что-нибудь
break;
case MyCodeISR:
// Сработал наш ISR, сделать что-нибудь
break;
default:
// Неизвестный код импульса
break;
}
} else {
// rcvid - не нуль, значит, это обычное
// клиентское сообщение. Сделать что-нибудь.
}
Отметим, что это пример для случая, когда вы обрабатываете сообщения самостоятельно. Но поскольку мы рекомендуем использовать библиотеку администратора ресурсов, на самом деле ваша программа выглядела бы примерно так:
int main(int argc, char **argv) {
...
// Выполнить обычные инициализации
pulse_attach(dpp, 0, MyCodeTimer, my_timer_pulse_handler,
NULL);
pulse_attach(dpp, 0, MyCodeISR, my_isr_pulse_handler,
NULL);
...
}
На этот раз мы предписываем библиотеке администратора ресурсов ввести две проверки из предыдущего примера в основной цикл приема сообщений и вызывать две наши функции обработки (
Если вы анализируете содержимое прокси (фактически игнорируя, что это прокси, и обрабатывая их как сообщения), то вы автоматически имеете дело с тем, что в QNX4 на прокси ответить нельзя. В QNX/Neutrino ответить на импульс тоже нельзя. Это означает, что у вас уже есть код, который либо анализирует идентификатор, возвращаемый функцией приема, и определяет, что это прокси, и отвечать не надо, либо смотрит на содержимое сообщения и по нему определяет, надо отвечать на это сообщение или нет.
К сожалению в QNX/Neutrino произвольные данные в импульс не запихнешь. Импульс имеет четко определенную структуру, и обойти это нельзя. Умным решением здесь было бы «имитировать» сообщение от прокси при помощи импульса и таблицы. Таблица содержала бы сообщения, которые раньше передавались посредством прокси. Получив импульс, вы использовали бы поле
Обработчики прерываний
Обработчики прерываний в QNX4 могли либо возвратить идентификатор прокси (указывая этим, что надо переключить прокси и таким образом уведомить ее владельца о прерывании), либо возвратить нуль (что означало бы, что в дальнейшем ничего делать не требуется). В QNX/Neutrino механизм почти идентичен — за исключением того, что вместо возвращения идентификатора прокси вы возвращаете указатель на struct sigevent
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT