Официальный форум СВД Встраиваемые Системы
10 Декабря, 2016, 15:40:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема запуска программы на другом узле  (Прочитано 1247 раз)
LH
Опытный пользователь

Сообщений: 254


« : 24 Декабря, 2010, 16:15:00 »

Имеются 2 узла сети qnet в QNX6.5 c именами "А1" и "А2".

Программа Prog1(приложение Photon) запускается на узле "А1" и с помощью PtSpawn() запускает программу
Prog2 на узле "А2".

Для этого в PtSpawn() в структуре opts указывается :

opts = PtSpawnDefaults;
opts.options.flags = SPAWN_SETND;
opts.options.nd = netmgr_strtond( "A2", NULL);

До этого места все работает нормально.

Проблема возникает когда ту же программу Prog1 из pterm-консоли узла "А1" запустить на узле "А2":
$on -n A2 Prog1

В этом случае программа Prog1 выполняется на узле "А2" и запускает программу Prog2.
Но Prog2  исполняется не на узле "А2", как ожидалось, а на узле "А1".

Почему так происходит?

Можно запустить на узле А1:
$Prog1 -N A2 -P Prog1

В этом случае первая Prog1 успешно запускает вторую Prog1 на узле
А2, вторая Prog1 пытается запустить Prog2 ( по умолчанию ) на узле А2,
но на самом деле Prog2 начинает работать на узле А1 ?!


P.S.
подобной проблемы  (или особенности) с PtSpawn() в QNX4 не наблюдалось...






« Последнее редактирование: 27 Декабря, 2010, 20:34:20 от LH » Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 80



WWW
« Ответ #1 : 29 Декабря, 2010, 19:06:41 »

Так происходит из-за того, что Вы не сменили корневую директорию.
В результате Prog1, запущенный на A2, ищет id узла A2 на узле A1. Так получается, что id узла A2 на узле A1 совпало с id узла A1 на A2 и Prog2 запустилась на A1.
Если же, сменить корневую директорию chroot( "/net/A2" ), то Prog2 действительно запустится на узле A2.

Нужно учитывать, что в первом случае (без chroot()) Prog1 и Prog2, ищутся на первом узле, а после chroot( "/net/A2" ) будут искаться на втором узле.

Что касается утилиты on, то у неё эти два варианта запуска реализуются ключами -n и -f
# on -f A2 Prog1
Записан

Сотрудник СВД Встраиваемые Системы
LH
Опытный пользователь

Сообщений: 254


« Ответ #2 : 04 Января, 2011, 17:15:39 »

Я не вполне точно описал проблему с Prog1 и Prog2, в дальнейшем все происходило с "точностью до наоборот",
но Вы все правильно объяснили, спасибо.

Применение chroot() в процессе-ребенке перед netmgr_strtond() не поправляет ситуацию.

Применение chroot() в процессе-родителе перед PtSpawn() действительно помогает, но появляются проблемы.

Prog1 - прототип рабочей программы, которая многократно запускает себя и другие программы проекта на разных узлах.

При повторных применениях chroot() перед PtSpawn() эта ф-ция начинает завершаться с ошибками, в т.ч. с errno=90 "Too many levels of symbolic links or prefixes" .

Как можно посмотреть префикс перед корневой папкой после chroot(), можно ли как-то "нейтрализовать" вызов chroot() для повторного применения? ( chroot(""), chroot("/") не помогают )?

Пока за корректным netmgr_strtond() начал обращаться сообщением к отдельному процессу, запущенному на каждом узле, не очень красиво.

Спасибо.




Записан
LH
Опытный пользователь

Сообщений: 254


« Ответ #3 : 19 Января, 2011, 17:49:00 »

Выяснил:
-Посмотреть полный путь можно с помощью realpath().
=Многократно chroot() применять не стоит, т.к. каждый раз происходит
добавление пути к префиксу, т.е. добавления "накапливаются".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

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

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

В последний раз google посещал эту страницу 05 Ноября, 2016, 07:37:25