Философия переноса программ
Давайте теперь взглянем на все «сверху». Здесь мы рассмотрим:
• обмен сообщениями и систему «клиент/сервер»;
• обработчики прерываний (ISR).
Анализ обмена сообщениями
В QNX4 клиент мог найти сервер двумя способами:
• используя глобальное пространство имен;
• выполнение
Если взаимоотношения «клиент/сервер, которые вы переносите, базируются на глобальном пространстве имен, тогда клиент использует:
а сервер регистрирует свое имя при помощи:
В этом случае у вас есть два выбора. Вы можете либо попробовать сохранить вариант с глобальными именами, либо модифицировать клиента и сервер так, чтобы они работали подобно стандартному администратору ресурсов.
Я рекомендую вам последний вариант, поскольку именно этот вариант характерен для QNX/Neutrino — сводить все к администраторам ресурсов, а не пытаться навесить кусок администратора ресурсов на службу глобальных имен.
Модификация будет достаточно проста. Скорее всего, клиентская сторона вызывает функцию, либо возвращающую идентификатор серверного процесса, либо создающую виртуальный канал («VC» — Virtual Circuit) от клиентского узла к удаленному узлу сервера. В обоих случаях как идентификатор процесса, так и идентификатор виртуального канала к удаленному процессу определяются при помощи
Преодолеть основное различие можно было бы, возвращая вместо идентификатора процесса идентификатор соединения. Поскольку клиент в QNX4, вероятно, не анализирует идентификаторы процессов (да и зачем? Так, просто число), вы могли бы «обмануть» его, применив к «глобальному имени» функцию
/*
* CLID_Attach(ServerName)
*
* Эта подпрограмма отвечает за установление соединения
* с сервером CLID.
*
* Возвращает PID сервера CLID или идентификатор
* виртуального канала к нему.
*/
// Сюда запишется имя - для других библиотечных вызовов
static char CLID_serverName(MAX_CLID_SERVER_NAME + 1);
// Сюда запишется идентификатор сервера
CLID static int clid_pid = -1;
int CLID_Attach(char *serverName) {
if (ServerName == NULL) {
sprintf(CLID_serverName, "/PARSE/CLID");
} else {
strcpy(CLID_serverName, serverName);
}
clid_pid = qnx_name_locate(0, CLID_serverName,
sizeof(CLID_ServerIPC), NULL);
if (clid_pid != -1) {
CLID_IPC(CLID_MsgAttach); // Послать сообщение ATTACH
return (clid_pid);
}
return (-1);
}
Вы могли бы изменить это на следующее:
/*
* CLID_Attach(serverName), версия для QNX/Neutrino
*/
int CLID_Attach(char *serverName) {
if (ServerName == NULL) {
sprintf(CLID_serverName, "/PARSE/CLID");
} else {
strcpy(CLID_serverName, serverName);
}
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT