Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 64

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

#include <errno.h>

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <devctl.h>

#include <locale.h>

#include "/home/ZZZ/TESTS/MR/MessTest.h"


int PrivatHandler(message_context_t *ctp, int code,

 unsigned flags, void* handle);

char* IdLabelParse(int id);


 // Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ связи

static resmgr_connect_funcs_t connect_funcs;

// Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

static resmgr_io_funcs_t io_funcs;

// Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² устройства

static iofunc_attr_t attr;


main(int args, char **argv) {

 resmgr_attr_t resmgr_attr; // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов

 dispatch_t *dpp;           // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру диспСтчСризации,

                            // содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ°Π½Π°Π»Π°.

 dispatch_context_t *ctp;   // ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½Π°Ρ структура; содСрТит Π±ΡƒΡ„Π΅Ρ€

                            // сообщСний, Π±ΡƒΡ„Π΅Ρ€ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

 int id;

 int result;

 char BufferRec[100];

 int rcvid;

 setlocale(LC_CTYPE, "C-TRADITIONAL");


 /* Π—Π΄Π΅ΡΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

    ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сСрвСра */

 /* Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ... */


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ интСрфСйса диспСтчСризации */

 if ((dpp = dispatch_create()) == NULL) {

  printf("%s: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ"

   " диспСтчСризации.\n", argv[0]);

  return EXIT_FAILURE;

 }

 /* Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎ адрСсу dpp создана структура диспСтчСризации */


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов */

 memset(&resmgr_attr, 0, sizeof resmgr_attr);

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = MESSIZE_MAX;

 /* Π—Π°Π΄Π°Π΅ΠΌ число доступных структур Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° (IOV) = 1.

    Π—Π°Π΄Π°Π΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° получСния Ρ€Π°Π²Π½Ρ‹ΠΌ MESSIZE_MAX.

    Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов */


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний */

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

  _RESMGR_IO_NFUNCS, &io_funcs);

 /* Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (структуры), Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

    ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для Π΄Π²ΡƒΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний:

    Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ связи ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

    Π’ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… мСстах Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

    iofunc_*_default() ... Π‘Π²ΠΎΠΈΠΌΠΈ Π½Π΅ замСняСм - Π½Π΅Ρ‚ нСобходимости. */


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ устройством структуры Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² */

 iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

 attr.nbytes = MESSIZE_MAX + 1;

 /* Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ инициализируСтся структура Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²,

    ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ устройством;

    S_IFNAM ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ устройства - Special named file,

    ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€Π°Π²Π° доступа,

    число Π±Π°ΠΉΡ‚ Π² рСсурсС задаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π±ΡƒΡ„Π΅Ρ€Π°. */


 /* ΠŸΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ устройства */

 if ((id = resmgr_attach(dpp, &resmgr_attr, "/dev/MESSTEST/RM", _FTYPE_ANY,

  0, &connect_funcs, &io_funcs, &attr)) == -1) {

  printf("%s: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ имя ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°"

   " рСсурсов.\n", argv[0]);

  return EXIT_FAILURE;

 }


 /* ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ дСйствиС: ΠΌΡ‹ рСгистрируСм Π½Π° нашСм ΡƒΠ·Π»Π΅ имя /dev/MESSTEST/RM

    dpp ΠΈ resmgr_attr - ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ структуры;

    /dev/MESSTEST/RM - ассоциированноС с устройством имя,

    _FTYPE_ANY - опрСдСляСт Ρ‚ΠΈΠΏ открытия устройства (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС

    Π΄ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся любой Ρ‚ΠΈΠΏ запроса открытия); Ρ€Π°Π²Π½Ρ‹ΠΉ Π½ΡƒΠ»ΡŽ Ρ„Π»Π°Π³

    Ρ€Π°Π·Π±ΠΎΡ€ΠΊΠΈ ΠΏΡƒΡ‚ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° опрСдСляСт, Ρ‡Ρ‚ΠΎ запрос -

    Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ /dev/MESSTEST/RM,

    &connect_funcs - Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ связи;

    &io_funcs - Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°;

    attr - инициализированная Π²Ρ‹ΡˆΠ΅ структура Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² устройства.

    ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ

    ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅, с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ для Ρ‚Π°ΠΊΠΈΡ… сообщСний -

    PrivatHandler() */

 if (message_attach(dpp, NULL, 0x5000, 0x5fff, &PrivatHandler, NULL) == -1) {

  printf("Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ "

   "Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… сообщСний\n");

  return(EXIT_FAILURE);

 }

 /* Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ контСкстной структуры */

 ctp = dispatch_context_alloc(dpp);

 /* Π Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° сообщСний, содСрТащСгося Π° этой структурС, Ρ€Π°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ

    число Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΆΠ΅ содСрТащихся Π² этой структурС,

    ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ структуры Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов */


 /* Запуск ΠΏΠ΅Ρ‚Π»ΠΈ сообщСний ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов */

 while(1) {

  // ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° сообщСний

  if ((ctp = dispatch_block(ctp)) == NULL) {

   printf("ошибка Π±Π»ΠΎΠΊΠ°\n");

   return EXIT_FAILURE;

  }

  printf("ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сообщСниС"

   " Π΄Π»ΠΈΠ½ΠΎΠΉ %i Π±Π°ΠΉΡ‚\n", ctp->resmgr_context.info.msglen);

  result = dispatch_handler(ctp);

  // сообщСниС раскодируСтся, ΠΈ Π½Π° основании Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ связи

  // ΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° вызываСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ функция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

  if (result)

   printf("ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов Π½Π΅ смог ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ"

    " сообщСниС result = %i\n", result);

 }

}


/********************************************************************

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… сообщСний, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сообщСний, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…

укладываСтся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ message_attach()

********************************************************************/

int PrivatHandler(message_context_t* ctp, int code,

 unsigned flags, void* handle) {

 char Buffer[MESSIZE_MAX];

 printf("ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ΅ сообщСниС Ρ‚ΠΈΠΏ %x ΠΎΡ‚"

  " \"%s\"\n", code, IdLabelParse(code));

 printf("Π’ΠΎΡ‚ это сообщСниС <<%s>>\n",

  (char *)(ctp->msg) + 4);

 strcpy(Buffer, "ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρƒ: Π΄Π°, я Ρ‚Π°ΠΊΠΎΠΉ");

 MsgReply(ctp->rcvid, EOK, Buffer, sizeof(Buffer));

 return(0);

}


/********************************************************************

Ѐункция ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅

имя процСсса ΠΏΠΎ Π΅Π³ΠΎ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅

********************************************************************/

char* IdLabelParse(int id) {

 struct IdLabel_t Inventory;

 int i = 0;

 while (IdLabel[i].id != id && i < ALLNUM_MYPROC) i++;

 if (i == ALLNUM_MYPROC) return Anonymous;

 else return(IdLabel[i].name);

}

ИспользованиС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½

Начиная с QNX вСрсии 6.3 сСрвис Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, обСспСчиваСмый GNS-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ слуТбы (ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ gns), дСйствуСт Π² сСти. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот сСрвис, Π½Π΅Ρ‚ нСобходимости ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов, ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ свою слуТбу, Π° прилоТСния-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слуТбы Ρ‡Π΅Ρ€Π΅Π· QNET-ΡΠ΅Ρ‚ΡŒ Π±Π΅Π· знания Ρ‚Π°ΠΊΠΈΡ… частностСй, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ эта слуТба располагаСтся ΠΈ ΠΊΡ‚ΠΎ Π΅Π΅ обСспСчиваСт. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ сСрвисС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ см. Π² [4].

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ этот сСрвис, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ сСрвСра Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π½Π° Ρ‚ΠΎΠΌ ΡƒΠ·Π»Π΅, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр. Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ сСрвСра GNS-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ выступаСт Π² Ρ€ΠΎΠ»ΠΈ Π½Π΅ΠΊΠΎΠΉ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, хранящСй ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ слуТбы, ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запросы Π½Π° поиск ΠΈ установлСниС связи с Π½ΠΈΠΌΠΈ. На ΡƒΠ·Π»Π΅ ΠΆΠ΅, Π³Π΄Π΅ располагаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚, запускаСм ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΏΡ€ΠΈ этом ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ запросы объявлСния, поиска ΠΈ установки связи ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ располоТСнным Π½Π° этом ΠΆΠ΅ ΡƒΠ·Π»Π΅) ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром (сСрвСрами) gns.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π»:

# gns -s

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» (ΡƒΠ·Π»Ρ‹):

# gns -с

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° ΡƒΠ·Π»Π°Ρ…, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ слуТбы Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, появятся ΠΈΠΌΠ΅Π½Π° /dev/name/global ΠΈ /dev/name/local. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ gns-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ сСрвСр, Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ сСти ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²ΠΈΠ΄ пространства ΠΈΠΌΠ΅Π½ Π½Π° /dev/name/global. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ локальноС пространство ΠΈΠΌΠ΅Π½ /dev/name/local, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΡ‚ локального пространства ΠΈΠΌΠ΅Π½ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ машинС. (ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΠΌΠ΅Π½ global ΠΈ local ΠΏΠΎΠ΄ /dev/name/ появится Π΅Ρ‰Π΅ имя gns_server ΠΈΠ»ΠΈ gns_local β€” имя, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ рСгистрируСтся сам GNS-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€.)