Сетевое взаимодействие. Возможности утилиты on. Сетевое расширение интерпретатора

Страницы работы

Фрагмент текста работы

Запущенный таким образом процесс использует ресурсы (память и процессор) удаленного узла, но весь ввод/вывод направляется на ту консоль, откуда он был запущен, если не указан параметр "-t", то есть рабочий терминал. Также не стоит забывать, что в случае использования ключа "-n" не изменяется корневой каталог, и все файлы загружаются с файловой системы локального узла, если к файлу не указан полный сетевой путь.

Запуск на удаленном узле применяется обычно для разгрузки процессора или памяти на локальном узле, например, на маломощных машинах с небольшим количеством памяти и слабым процессором. Таким же образом, один компьютер может распределять свои задачи на целой группе машин, образуя своеобразный кластер. Команда on может быть полезна еще и для административных целей: запуска менеджеров ресурсов, демонов, утилит диагностики.

Приведем пример использования утилиты On.

При задании ключа –f, и выполнении команды  «ls /tmp» видим содержимое папки tmp другого компьютера. Имя компьютера, на котором запускались эти команды «SPOcomp4».

$ on -f /net/SPOcomp11 ls /tmp

_sortAAA876586     cdt70260cdt        np2                tr.txt

_sortBAA876586     np1                sset77705.tmp

При задании ключа –n видим содержимое этой же папки, но на своей машине.

$ on -n /net/SPOcomp11 ls /tmp

42

cdt33090cdt

cdt37638cdt

cdt59522cdt

cdt59523cdt

client.c

client_pulsexx91125.tmp

data.txt

globalhist.html

gmon.out

intepolation_client_groot1239627385380

interpolation_client_IDE_groot1239626551994

interpolation_server_gxx30142.tmp

scr1.jpg

server.c

set1.bmp

Другой пример показывает аналогичную ситуацию, запуск производится с другого компьютера, SPOcomp11.

Ключ –n: видим процессы этого компьютера SPOcomp11.

$ on -n SPOcomp4 ps -A

PID TTY          TIME CMD

1 ?        00:32:39

2 ?        00:00:00 /sbin/tinit

4099 ?        00:00:00 pci-bios

4100 ?        00:00:00 slogger

4101 ?        00:00:03 io-usb

4102 ?        00:00:01 io-hid

4103 ?        00:00:00 devc-con-hid

8200 ?        00:00:06 devb-eide

8201 ?        00:00:00 umass-enum

16394 ?        00:00:00 pipe

20491 ?        00:00:00 mqueue

258060 ?        00:00:00 fontsleuth

110605 ?        00:00:00 devb-fdc

77838 ?        00:00:00 devc-ser8250

131087 ?        00:00:01 devc-pty

77840 ?        00:00:00 devc-par

319505 ?        00:00:00 login

77842 ?        00:00:09 io-net

135187 ?        00:00:00 random

94228 ?        00:00:00 spooler

147477 ?        00:00:00 dumper

163862 ?        00:00:00 login

163863 ?        00:00:00 login

163864 ?        00:00:00 login

540697 ?        00:00:00 pfm

409626 ?        00:00:00 pwm

208923 ?        00:00:03 Photon

237596 ?        00:00:02 phfont

540701 ?        00:00:00 pterm

286750 ?        00:00:41 io-graphics

307231 ?        00:00:00 /usr/photon/bin/devi-hid

454688 ?        00:00:00 shelf

491553 ?        00:00:01 bkgdmgr

491554 ?        00:00:00 wmswitch

491555 ?        00:00:00 saver

540708 ?        00:00:00 /bin/sh

712741 ?        00:00:00 devb-umass

589862 ?        00:00:00 pfm

630823 ?        00:00:00 pfm

634920 ?        00:00:00 ped

639017 ?        00:00:00 helpviewer

639018 ?        00:00:00 vserver.file

725035 ?        00:00:00 pfm

749612 ?        00:00:00 ped

753709 ?        00:00:00 ped

757806 ?        00:00:00 pterm

757807 ?        00:00:00 /bin/sh

815152 ?        00:00:00 snapshot

815153 ?        00:00:00 pv

847922 ?        00:00:00 helpviewer

847923 ?        00:00:01 helpviewer

847924 ?        00:00:00 pfm

856117 ?        00:00:00 pterm

856118 ?        00:00:00 /bin/sh

921655 ?        00:00:00 pfm

938040 ?        00:00:00 pfm

999481 ?        00:00:08 pterm

999482 ?        00:00:00 /bin/sh

999483 ?        00:00:01 find

1126460 ?        00:00:00 on

Ключ –f: видим процессы компьютера SPOcomp4.

$ on -f SPOcomp4 ps -A

PID TTY          TIME CMD

1 ?        00:41:07

2 ?        00:00:00 /sbin/tinit

4099 ?        00:00:00 pci-bios

4100 ?        00:00:00 slogger

4101 ?        00:00:02 io-usb

4102 ?        00:00:01 io-hid

4103 ?        00:00:00 devc-con-hid

8200 ?        00:00:02 devb-eide

245769 ?        00:00:01 phfont

8202 ?        00:00:00 devb-umass

16395 ?        00:00:00 pipe

20492 ?        00:00:00 mqueue

266253 ?        00:00:00 fontsleuth

110606 ?        00:00:00 devb-fdc

77839 ?        00:00:00 devc-ser8250

131088 ?        00:00:00 devc-pty

77841 ?        00:00:00 devc-par

327698 ?        00:00:00 login

77843 ?        00:00:07 io-net

135188 ?        00:00:00 random

94229 ?        00:00:00 spooler

147478 ?        00:00:00 dumper

151575 ?        00:00:00 qconn

167960 ?        00:00:00 login

167961 ?        00:00:00 login

167962 ?        00:00:00 login

544795 ?        00:00:00 phlip

417820 ?        00:00:00 pwm

213021 ?        00:00:01 Photon

925726 ?        00:00:00 helpviewer

294943 ?        00:00:37 io-graphics

315424 ?        00:00:00 /usr/photon/bin/devi-hid

462881 ?        00:00:00 shelf

499746 ?        00:00:00 bkgdmgr

499747 ?        00:00:00 wmswitch

499748 ?        00:00:00 saver

614437 ?        00:00:00 pfm

614438 ?        00:00:00 pfm

729127 ?        00:00:00 pfm

729128 ?        00:00:00 pterm

729129 ?        00:00:00 /bin/sh

925738 ?        00:00:00 vserver.file

827436 ?        00:00:00 pv

1126445 ?        00:00:00 ps

Как видно, утилита on в ряде случаев действительно полезна. Часть ее функций просто незаменима в крупных, распределенных по сети проектах, однако применять ее в "чистом" виде, т.е. вызывая с помощью system() весьма неудобно и непрактично. Давайте рассмотрим программные реализации некоторых полезных свойств этой утилиты.

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

Server.c – запуск с компьютера SPOcomp4

#include <sys/neutrino.h>

#include <sys/netmgr.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <errno.h>

int main(void)

{

int rcvid;

int chid, pid;

char message[200];

pid=getpid(0);

chid=ChannelCreate(0);

printf("SERVER: Channel id= %i PID=%i \n", chid,pid);

while(1)

{

rcvid=MsgReceive(chid, message, sizeof(message), NULL);

if(rcvid>0)

{

printf("SERVER: We receive message \n");

printf("SERVER: MESSAGE: \"%s\". \n", message);

strcpy(message, "Hello, I am server");

if (MsgReply(rcvid,EOK, message, 200)==-1)

{

printf("SERVER: Reply Error. \n");

}

}

}

return 0;

}

Client.c - запуск с компьютера SPOcomp11

#include <sys/neutrino.h>

#include <sys/netmgr.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <errno.h>

int main(void){

int nd;

char *smsg = "Hello, I am 1st client";

char rmsg[200];

int coid;

int chid, pids;

printf("Enter channel id and pid \n");

scanf("%d %d", &chid, &pids);

nd=netmgr_strtond("SPOcomp4", NULL);

printf("%i", nd);

coid=ConnectAttach(nd,pids,chid,0,0);

if(coid==-1)

{

printf("Error Connect attach %i %i \n", pids, chid);

perror(NULL);

exit(EXIT_FAILURE);

}

printf("CLIENT: Sending! \n");

if(MsgSend(coid, smsg, strlen(smsg)+1, rmsg, sizeof(rmsg))==-1)

{

fprintf(stderr, "Error msgSend \n");

perror(NULL);

exit(EXIT_FAILURE);

}

if(strlen(rmsg)>0)

{

printf("CLIENT: This what server Reply to me: \n  %s \n", rmsg);

}

ConnectDetach(coid);

return 0;

}

На рисунках – иллюстрация работы программы.

Терминал SPOcomp4

Терминал SPOcomp11

Проиллюстрируем работу утилиты pidinc ключом –n.

Pidin -n node   The name of the remote node from which to get the information.

То есть при запуске этой утилиты с указанием имени удалённого компьютера, мы получаем информацию о процессах, запущенных на нём.

Пример:

Получение информации о процессах на удалённом компьютере:

$ pidin -n SPOcomp4

pid tid name               prio STATE       Blocked

1   1 procnto              0f READY

1   2 procnto             10r RUNNING

1   3 procnto             10r RECEIVE     1

1   4 procnto             10r RECEIVE     1

1   5 procnto             21r RECEIVE     1

1   6 procnto             10r RECEIVE     1

1   7 procnto             21r RECEIVE     1

1   8 procnto             10r RECEIVE     1

1   9 procnto             10r RECEIVE     1

1  10 procnto             10r RECEIVE     1

1  11 procnto             10r RECEIVE     1

2   1 sbin/tinit          10o REPLY       1

4099   1 proc/boot/pci-bios  21o RECEIVE     1

4100   1 proc/boot/slogger   21o RECEIVE     1

4101   1 proc/boot/io-usb    10o SIGWAITINFO

4101   2 proc/boot/io-usb    21r RECEIVE     4

4101   3 proc/boot/io-usb    21r RECEIVE     7

4101   4 proc/boot/io-usb    21r RECEIVE     10

4101   5 proc/boot/io-usb    21r RECEIVE     13

4101   6 proc/boot/io-usb    21r RECEIVE     16

4101   7 proc/boot/io-usb    21r RECEIVE     1

4101   8 proc/boot/io-usb    21o RECEIVE     19

4101   9 proc/boot/io-usb    10r NANOSLEEP

4101  11 proc/boot/io-usb    21o RECEIVE     19

4102   1 proc/boot/io-hid    10o SIGWAITINFO

4102   2 proc/boot/io-hid    10o RECEIVE     4

4102   3 proc/boot/io-hid    10o RECEIVE     4

4102   4 proc/boot/io-hid    10r REPLY       4101

4102   5 proc/boot/io-hid    15r RECEIVE     12

4102   6 proc/boot/io-hid    15r RECEIVE     16

4103   1 /boot/devc-con-hid  10o RECEIVE     1

4103   2 /boot/devc-con-hid  10o REPLY       4102

8200   1 roc/boot/devb-eide  10o SIGWAITINFO

8200   2 roc/boot/devb-eide  21r RECEIVE     1

8200   3 roc/boot/devb-eide  21r RECEIVE     4

8200   4 roc/boot/devb-eide  10o RECEIVE     10

8200   6 roc/boot/devb-eide  12o RECEIVE     7

8200   7 roc/boot/devb-eide  10o RECEIVE     7

8200   8 roc/boot/devb-eide  10o RECEIVE     7

8200  11 roc/boot/devb-eide  10o RECEIVE     7

8200  12 roc/boot/devb-eide  10o RECEIVE     7

8202   1 oc/boot/devb-umass  10r SIGWAITINFO

8202   2 oc/boot/devb-umass  21r REPLY       4101

8202   4 oc/boot/devb-umass  10r RECEIVE     7

8202   5 oc/boot/devb-umass  21r RECEIVE     4

8202   6 oc/boot/devb-umass  10r RECEIVE     4

8202   7 oc/boot/devb-umass  10r RECEIVE     4

16395   1 sbin/pipe           10o SIGWAITINFO

16395   2 sbin/pipe           10o RECEIVE     1

16395   3 sbin/pipe           10o RECEIVE     1

16395   4 sbin/pipe           10o RECEIVE     1

16395   5 sbin/pipe           10o RECEIVE     1

20492   1 sbin/mqueue         10o RECEIVE     1

77839   1 sbin/devc-ser8250   21o RECEIVE     1

77841   1 sbin/devc-par       10o RECEIVE     1

77841   2 sbin/devc-par        9r CONDVAR     8053e00

77843   1 sbin/io-net         10o SIGWAITINFO

77843   2 sbin/io-net         20o RECEIVE     5

77843   3 sbin/io-net         10o RECEIVE     1

77843   4 sbin/io-net         10o RECEIVE     1

77843   5 sbin/io-net         10o RECEIVE     1

77843   6 sbin/io-net         21r RECEIVE     19

77843   7 sbin/io-net         10o RECEIVE     25

77843   8 sbin/io-net         10o RECEIVE     28

77843   9 sbin/io-net         10o RECEIVE     1

94229   1 usr/sbin/spooler    10o NANOSLEEP

110606   1 sbin/devb-fdc       10o SIGWAITINFO

110606   2 sbin/devb-fdc       21r RECEIVE     1

94229   1 usr/sbin/spooler    10o NANOSLEEP

110606   1 sbin/devb-fdc       10o SIGWAITINFO

110606   2 sbin/devb-fdc       21r RECEIVE     1

110606   3 sbin/devb-fdc       10o RECEIVE     7

110606   4 sbin/devb-fdc       10o RECEIVE     4

110606   5 sbin/devb-fdc       10o RECEIVE     4

110606   6 sbin/devb-fdc       10o RECEIVE     4

131088   1 sbin/devc-pty       10o RECEIVE     1

135188   1 usr/sbin/random     10o SIGWAITINFO

135188   2 usr/sbin/random     21o RECEIVE     1

135188   3 usr/sbin/random     10o NANOSLEEP

147478   1 usr/sbin/dumper     21o RECEIVE     1

151575   1 usr/sbin/qconn      10o SIGWAITINFO

151575   2 usr/sbin/qconn      10o CONDVAR     8062da0

151575   3 usr/sbin/qconn      21o RECEIVE     1

151575   4 usr/sbin/qconn      21o RECEIVE     3

167960   1 bin/login           10o REPLY       4103

167961   1 bin/login           10o REPLY       4103

167962   1 bin/login           10o REPLY       4103

213021   1 /photon/bin/Photon  10r RECEIVE     1

245769   1 /photon/bin/phfont  10o JOIN        2

245769   2 /photon/bin/phfont  10o RECEIVE     1

266253   1 ton/bin/fontsleuth  10o RECEIVE     1

266253   2 ton/bin/fontsleuth  10o SIGWAITINFO

266253   3 ton/bin/fontsleuth   6o RECEIVE     1

266253   4 ton/bin/fontsleuth  10o RECEIVE     1

294943   1 on/bin/io-graphics  21r RECEIVE     1

294943   2 on/bin/io-graphics  12r REPLY       266253

294943   3 on/bin/io-graphics  12r REPLY       213021

315424   1 hoton/bin/devi-hid  10o DEAD

315424   2 hoton/bin/devi-hid  10o REPLY       4102

315424   3 hoton/bin/devi-hid  12o SIGWAITINFO

327698   1 bin/login           10o REPLY       4103

417820   1 usr/photon/bin/pwm  10r RECEIVE     1

462881   1 r/photon/bin/shelf  10r RECEIVE     1

462881   2 r/photon/bin/shelf  10r CONDVAR     8075ccc

499746   1 photon/bin/bkgdmgr  10r RECEIVE     1

499747   1 hoton/bin/wmswitch  10r RECEIVE     2

499748   1 r/photon/bin/saver  10r RECEIVE     1

544795   1 r/photon/bin/phlip  10r RECEIVE     1

614437   1 usr/photon/bin/pfm  10r RECEIVE     1

614438   1 usr/photon/bin/pfm  10r RECEIVE     2

729127   1 usr/photon/bin/pfm  10r RECEIVE     2

729128   1 r/photon/bin/pterm  10r RECEIVE     1

729129   1 bin/sh              10r REPLY       131088

827436   1 usr/photon/bin/pv   10r RECEIVE     1

925726   1 ton/bin/helpviewer  10r RECEIVE     1

925738   1 n/bin/vserver.file  10r RECEIVE     1

1065003     (Zombie)

1130541   1 photon/bin/voyager  10r RECEIVE     1

1130542   1 bin/sh              10r SIGSUSPEND

1155119   1 /mozilla/mozserver  10r RECEIVE     1

1155119   2 /mozilla/mozserver  10r SIGWAITINFO

1155119   3 /mozilla/mozserver  10r CONDVAR     80b3908

1155119   4 /mozilla/mozserver  10r CONDVAR     80f0960

1155119   5 /mozilla/mozserver  10r CONDVAR     82c7598

1155119   7 /mozilla/mozserver  10r CONDVAR     82c7598

1155119   8 /mozilla/mozserver  10r CONDVAR     82c7598

Получение информации о процессах на локальном компьютере, аналогично pidin без ключей:

$ pidin -n SPOcomp11

pid tid name               prio STATE       Blocked

1   1 procnto              0f READY

1   2 procnto             10r RECEIVE     1

1   3 procnto             21r RECEIVE     1

1   4 procnto             10r RECEIVE     1

1   5 procnto             21r RECEIVE     1

1   6 procnto             11r RECEIVE     1

1   7 procnto             10r RECEIVE     1

1   8 procnto             10r RECEIVE     1

1   9 procnto             10r RUNNING

2   1 sbin/tinit          10o REPLY       1

4099   1 proc/boot/pci-bios  10o RECEIVE     1

4100   1 proc/boot/slogger   10o RECEIVE     1

4101   1 proc/boot/io-usb    10o SIGWAITINFO

4101   2 proc/boot/io-usb    21r RECEIVE     4

4101   3 proc/boot/io-usb    21r RECEIVE     7

4101   4 proc/boot/io-usb    21r RECEIVE     1

4101   6 proc/boot/io-usb    10r NANOSLEEP

4101   7 proc/boot/io-usb    21o RECEIVE     10

4101   8 proc/boot/io-usb    10o RECEIVE     10

4102   1 proc/boot/io-hid    10o SIGWAITINFO

4102   2 proc/boot/io-hid    10o RECEIVE     4

4102   3 proc/boot/io-hid    10o RECEIVE     4

4102   4 proc/boot/io-hid    10r REPLY       4101

4102   5 proc/boot/io-hid    15r RECEIVE     12

4102   6 proc/boot/io-hid    15r RECEIVE     16

4103   1 /boot/devc-con-hid  10o RECEIVE     1

4103   2 /boot/devc-con-hid  10o REPLY       4102

8200   1 roc/boot/devb-eide  10o SIGWAITINFO

8200   2 roc/boot/devb-eide  21r RECEIVE     1

8200   3 roc/boot/devb-eide  21r RECEIVE     4

8200   4 roc/boot/devb-eide  10o RECEIVE     10

8200   5 roc/boot/devb-eide  10o RECEIVE     7

8200   6 roc/boot/devb-eide  10o RECEIVE     7

8200   7 roc/boot/devb-eide  10o RECEIVE     7

8200   8 roc/boot/devb-eide  10o RECEIVE     7

8200  11 roc/boot/devb-eide  10o RECEIVE     7

8201   1 oc/boot/umass-enum  10o SIGWAITINFO

8201   2 oc/boot/umass-enum  10r REPLY       4101

16394   1 sbin/pipe           10o SIGWAITINFO

16394   2 sbin/pipe           10o RECEIVE     1

16394   3 sbin/pipe           10o RECEIVE     1

16394   4 sbin/pipe           10o RECEIVE     1

20491   1 sbin/mqueue         10o RECEIVE     1

77838   1 sbin/devc-ser8250   10o RECEIVE     1

77840   1 sbin/devc-par       10o RECEIVE     1

77840   2 sbin/devc-par        9r CONDVAR     8053e00

77842   1 sbin/io-net         10o SIGWAITINFO

77842   2 sbin/io-net         20o RECEIVE     5

77842   3 sbin/io-net         10o RECEIVE     1

77842   4 sbin/io-net         10o RECEIVE     1

77842   5 sbin/io-net         10o RECEIVE     1

77842   6 sbin/io-net         21r RECEIVE     19

77842   7 sbin/io-net         21o RECEIVE     25

77842   8 sbin/io-net         20o RECEIVE     28

94228   1 usr/sbin/spooler    10o NANOSLEEP

110605   1 sbin/devb-fdc       10o SIGWAITINFO

110605   2 sbin/devb-fdc       21r RECEIVE     1

110605   3 sbin/devb-fdc       10o RECEIVE     7

110605   4 sbin/devb-fdc       10o RECEIVE     4

110605   5 sbin/devb-fdc       10o RECEIVE     4

110605   6 sbin/devb-fdc       10o RECEIVE     4

131087   1 sbin/devc-pty       10o RECEIVE     1

135187   1 usr/sbin/random     10o SIGWAITINFO

135187   2 usr/sbin/random     10o RECEIVE     1

135187   3 usr/sbin/random     10o NANOSLEEP

147477   1 usr/sbin/dumper     10o RECEIVE     1

163862   1 bin/login           10o REPLY       4103

163863   1 bin/login           10o REPLY       4103

163864   1 bin/login           10o REPLY       4103

208923   1 /photon/bin/Photon  12r RECEIVE     1

237596   1 /photon/bin/phfont  10o JOIN        2

237596   2 /photon/bin/phfont  10o RECEIVE     1

258060   1 ton/bin/fontsleuth  10o RECEIVE     1

258060   2 ton/bin/fontsleuth  10o SIGWAITINFO

258060   3 ton/bin/fontsleuth   6o RECEIVE     1

258060   4 ton/bin/fontsleuth  10o RECEIVE     1

286750   1 on/bin/io-graphics  10r RECEIVE     1

286750   2 on/bin/io-graphics  12r REPLY       258060

286750   3 on/bin/io-graphics  12r REPLY       208923

307231   1 hoton/bin/devi-hid  10o DEAD

307231   2 hoton/bin/devi-hid  10o REPLY       4102

307231   3 hoton/bin/devi-hid  12o SIGWAITINFO

319505   1 bin/login           10o REPLY       4103

409626   1 usr/photon/bin/pwm  10r RECEIVE     1

454688   1 r/photon/bin/shelf  10r CONDVAR     8075ccc

454688   2 r/photon/bin/shelf  10r RECEIVE     1

491553   1 photon/bin/bkgdmgr  10r RECEIVE     1

491554   1 hoton/bin/wmswitch  10r RECEIVE     2

491555   1 r/photon/bin/saver  10r RECEIVE     1

540697   1 usr/photon/bin/pfm  10r RECEIVE     1

540701   1 r/photon/bin/pterm  10r RECEIVE     1

540708   1 bin/sh              10r REPLY       131087

589862   1 usr/photon/bin/pfm  10r REPLY       208923

634920   1 usr/photon/bin/ped  10r REPLY       208923

639017   1 ton/bin/helpviewer  10r RECEIVE     1

639018   1 n/bin/vserver.file  10r RECEIVE     1

712741   1 oc/boot/devb-umass  10r SIGWAITINFO

712741   2 oc/boot/devb-umass  21r REPLY       4101

712741   3 oc/boot/devb-umass  21r RECEIVE     1

712741   4 oc/boot/devb-umass  10r RECEIVE     7

712741   5 oc/boot/devb-umass  10r RECEIVE     4

712741   6 oc/boot/devb-umass  10r RECEIVE     4

712741   7 oc/boot/devb-umass  10r RECEIVE     4

712741   8 oc/boot/devb-umass  10r RECEIVE     4

725035   1 usr/photon/bin/pfm  10r REPLY       208923

749612   1 usr/photon/bin/ped  10r REPLY       208923

753709   1 usr/photon/bin/ped  10r REPLY       208923

757806   1 r/photon/bin/pterm  10r RECEIVE     1

757807   1 bin/sh              10r SIGSUSPEND

847922   1 ton/bin/helpviewer  10r RECEIVE     1

847923   1 ton/bin/helpviewer  10r RECEIVE     1

856117   1 r/photon/bin/pterm  10r RECEIVE     1

856118   1 bin/sh              10r REPLY       131087

999481   1 r/photon/bin/pterm  10r RECEIVE     1

999482   1 bin/sh              10r REPLY       131087

1212455   1 bin/pidin           10r REPLY       1

Использование GNS.

Для того, чтобы созданный канал с помощью name_attach можно было использовать для обмена сообщениями в сети, нужно при вызове функции указать флаг NAME_FLAG_ATTACH_GLOBAL.  При таком флаге, канал будет создан не в папке /dev/name/local/ , а в папке /dev/name/global. Для подключения к этому каналу используется функция name_open, также с флагом NAME_FLAG_ATTACH_GLOBAL . Для того, чтобы клиент с удалённой машины мог видеть папку global сервера, нужно  Включить сервис глобальных имён – gns.

Для сервера:              gns –s

Для клиента:             gns –c

Server.c

#include <errno.h>

#include <process.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

int main (int argc, char *argv[])

{

name_attach_t     *channel;  

int   rcvid;

char  receive_buf[50], reply_buf[50];

channel = name_attach(NULL, argv[1], NAME_FLAG_ATTACH_GLOBAL);

while (1) {

rcvid = MsgReceive(channel->chid, &receive_buf, sizeof(receive_buf), NULL);

// Если не импульс, обрабатываем сообщение

if (rcvid) {

if (strlen(receive_buf)) {

printf("Server: message from client \"%s\"\n", &receive_buf );

strcpy(reply_buf, "Hello from server");

printf("Server: send message \"%s\"\n", &reply_buf );

}

else {

strcpy(reply_buf, "ok");

}                

MsgReply(rcvid, EOK, &reply_buf, sizeof(reply_buf));

}

}

name_detach(channel, 0);

return EXIT_SUCCESS;

}

Client.c

#include <sys/dispatch.h>

#include <sys/neutrino.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <errno.h>

int main (int argc, char* argv

[]) {

int   coid, pid = getpid();

// Возвращаемое значение MsgSend

int status;

char  send_buf[50], reply_buf[50];

// Открытие канала. Для этого нужно знать только имя префикса и его тип (0 - локальный)

coid = name_open(argv[1], NAME_FLAG_ATTACH_GLOBAL);

sprintf(send_buf, "Hello from client with PID = %d", pid);

printf("Client: send message \"%s\"\n", &send_buf);

status = MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

if (status == -1) {

printf("Error of MsgSend\n");

return EXIT_FAILURE;

}

printf("Client: message \"%s\" from server\n", &reply_buf);

name_close(coid);

return EXIT_SUCCESS;

}

Иллюстрация работы программы

Сервер. SPOcomp10

Клиент. SPOcomp11

Пока не запущен gns, не будет создана папка global:

# ls /dev/name

ls: No such file or directory (/dev/name)

После того, как мы запустим gns, в папке /dev/name появится папка global

Похожие материалы

Информация о работе