Запуск на удаленном узле QNX сети

Запуск на удаленном узле — это одна из ключевых возможностей утилиты on. Для этого используется тот же вызов spawn(), что и в предыдущих примерах. В структуре inheritance предусмотрено специальное поле для дескриптора удаленного узла — nd.

Для того чтобы получить дескриптор узла, зная его имя, используется функция netmgr_strtond(), описанная в заголовочном файле <sys/netmgr.h>. Возвращаемый этой функцией дескриптор помещается в поле nd структуры inheritance.

Дескриптор узла однозначно определяет сетевой узел, но только для текущего (локального) узла и текущего процесса. Дескриптор узла необходимо получать каждый раз при установке соединения. Дескриптор локального узла определяется макросом ND_NODE_LOCAL, и, как правило, равен нулю. Для сравнения сетевых дескрипторов используется макрос ND_NODE_CMP, который возвращает 0, если дескрипторы указывают на один и тот же узел. Кроме установки дескриптора удаленного узла, в поле flags структуры inheritance необходимо также установить флаг SPAWN_SETND.

Рассмотрим небольшой пример:

int main( int argc, char * argv[]) {
struct inheritance inh;
pid_t pid;
int nd;
char * command = NULL;
char * node = NULL;

if( argc < 3 )
exit( EXIT_FAILURE );

inh.flags = 0;
Устанавливаем флаг SPAWN_SETND — запуск на удаленном узле. Обратите внимание, что флаг SPAWN_EXEC мы не устанавливаем!

inh.flags |= SPAWN_SETND;
node = (char*)strdup(argv[1]);
Получаем сетевой идентификатор узла и записываем его в поле nd структуры inheritance.

if( -1 == ( nd = netmgr_strtond( node, NULL ))) {
perror( «node» );
exit( EXIT_FAILURE );
}
inh.nd = nd;
command = (char *)strdup( argv[2] );
argv += 2;
pid = spawnp( command, 0, NULL, &inh;, argv, 0 );
}//main
Этот пример работает точно так же, как и вызов утилиты on с параметром «-n имя_узла»

В случае если необходимо продублировать функциональность утилиты on c параметром «-f», перед вызовом spawnp() добавляется вызов chroot() — изменение текущего корневого каталога с параметром «/net/имя_узла». Для этого в программу надо добавить всего несколько строк:

char buf[1024];
sprintf( buf, «/net/%s/», argv[1] );
chroot( buf ); // до вызова spawn!