Запущенный таким образом процесс использует ресурсы (память и процессор) удаленного узла, но весь ввод/вывод направляется на ту консоль, откуда он был запущен, если не указан параметр "-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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.