Официальный форум СВД Встраиваемые Системы
26 Апрель, 2024, 04:25:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: shared function  (Прочитано 2632 раз)
tihan
Интересующийся

Сообщений: 7


« : 17 Июнь, 2010, 11:53:57 »

Добрый день!
Помогите пожалуйста, у меня такая проблема:
В общем, есть два процесса и они друг другу должны предоставить некую функцию с помощью которой другой процесс может что-нибудь сказать тому, который спит в данный момент. При старте 1й процесс получает сегмент и смещение на функцию с помощью  FP_OFF и my_cs() и передаёт их во 2й процесс. Во втором процессе востанавливается указатель на функцию (mk_fp). Затем идёт попытка вызова функции, которая приводит к падению процесса. Если существует, какая-нибудь ссылка на похожее решение, буду очень признателен. Опереационная система Qnx 4.25
« Последнее редактирование: 17 Июнь, 2010, 11:56:48 от tihan » Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #1 : 17 Июнь, 2010, 15:32:41 »

Без примера исходного кода посоветовать что-то трудно.

Вы уверены, что Вам нужно применять именно такой тип взаимодействия? Чем не устраивает стандартные для QNX механизмы обмен сообщениями или разделяемая память? Тем более если просто что-то сказать другому процессу.
Записан
tihan
Интересующийся

Сообщений: 7


« Ответ #2 : 17 Июнь, 2010, 16:00:31 »

Вот пример того, что я пытаюсь реализовать:
process father:

   pid_t sonpid;

   struct
   {
      unsigned seg;
      long offset;
   } msg;

   void far* getbuf();
   void main()
   {
      sonpid = qnx_locate("SON".....);
      msg.seg = my_cs();
      msg.offset = FP_OFF(getbuf);
      Send(sonpid,&msg,0,sizeof(msg),0);
      ....
   }

   Process sonpid:

      void far*(far* getbuf)();
      unsigned SegFather;
      while(1)
      {
         proxy_proc = receive(0,&msg,sizeof(msg));
         if(proxy_proc == pidfather)
         {
            Reply(...);
            SegFather = MK_FP(msg.seg,0);
            getbuf = MK_FP(SegFather,msg.offset);
            getbuf();
         }
      }
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #3 : 17 Июнь, 2010, 16:29:19 »

Ничего удивительно в SIGSEGV не вижу. Вы пытаетесь выполнить код в своём адресном пространстве с какого-то произвольного адреса.

Вижу несколько логических ошибок в Вашем коде.

1. По умолчанию селектор сегмента кода любого процесса в QNX4 имеет номер 5 или 7 (в зависимости от уровня привилегий, т.е. ключа -T при сборке). Смысла в передаче такой информации в сообщении нет.

2. Указатель на функцию надо делать следующим образом:

Код:
getbuf = MK_FP(msg.seg, msg.offset);

3. Судя по названию функции, которую Вы хотите вызвать getbuf(), Вы хотите получить какие-то данные из другого процесса. Таким образом Вы этого не добьётесь. QNX это не DOS, в котором все процессы находятся в одном адресном пространстве и выполняются в реальном режиме. В QNX (как и в подавляющем большинстве современных операционных систем) каждый процесс выполняется в своём собственном адресном пространстве (код и данные).

Предлагаю ознакомиться с механизмом разделяемой памяти (shared memory) в QNX4. Подозреваю, что это именно то, что Вам нужно.
Записан
tihan
Интересующийся

Сообщений: 7


« Ответ #4 : 17 Июнь, 2010, 16:53:22 »

Олег, большое спасибо Вам за ответ. У меня к Вам вопрос, а как тогда работает пример net_raw, который подкладывает свои функции в Net manager для того чтобы получать ARP пакеты из сетевой карты.
Записан
Александр Варварик
Администратор
Легенда

Сообщений: 1353



WWW
« Ответ #5 : 17 Июнь, 2010, 19:08:10 »

Где-то был пример построения разделяемой библиотеки для qnx4, надо поискать.

Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 04 Апрель, 2022, 00:26:54