else
printf('Родитель, мой id = %i,'
'порожденный процесс имеет id = %i
', procid, childid);
if ((rcvid = MsgReceive(PChanid, RecBuffer, 100, NULL)) == -1)
printf('Родитель: от дитятки не удалось'
' получить сообщение
');
else {
printf('Родитель: от дитятки получено'
' сообщение:'%s'
', RecBuffer);
CChanid = atoi(RecBuffer);
strcpy(RecBuffer, 'спасибо, сынок');
if (MsgReply(rcvid, EOK, RecBuffer, 100) == -1)
printf('Родитель: почему-то не удалось '
'ответить сыночку: Ау, где ты?
');
}
if ((coid =
ConnectAttach(nid, childid, CChanid, _NTO_SIDE_CHANNEL, 0)) == -1) {
printf('Родитель: странно, но не смог установить'
' канал связи с ребенком:'
'nid = %i childid = %i CChanid = %i
', nid, childid, CChanid);
return(-1);
}
printf('Родитель: установил связь coid = %i с'
' ребенком
', coid);
errno = 0;
if (MsgSend(coid, SendBuf, 100, SendBuf, 100) == -1)
printf('Родитель: на MsgSend получил errno = %i
', errno);
else
printf('Родитель, получен отклик на MsgSend()'
', '%s'
', SendBuf);
printf('Родитель: позвольте откланяться
');
ChannelDestroy(Pchanid);
ConnectDetach(CChanid);
return(0);
}
Пример кода порожденного процесса
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <process.h>
#include <sys/netmgr.h>
#include <sys/neutrino.h>
#include <errno.h>
#include <locale.h>
int main(int argc, char **argv) {
int nid; // Дескриптор текущего узла
int CChanid; // Идентификатор созданного канала
int coid; // Идентификатор связи с родителем
// по созданному им каналу
pid_t Parpid; // Идентификатор родительского процесса
int rcvid; // Идентификатор отправителя
// полученного сообщения
char BufName[100];
char SendBuf[100], RecBuf[100];
setlocale(LC_CTYPE, 'C-TRADITIONAL');
if ((CChanid = ChannelCreate(0)) == -1)
printf('Ребенок: странно, но не удалось создать'
' канал
');
else
printf('Ребенок: канал CChanid = %i создан
', CChanid);
Parpid = atoi(argv[1]);
printf('Ребенок сообщает: он жив благодаря папане'
' Parpid = %i
', Parpid);
strcpy(BufName, '904-3');
if ((nid = netmgr_strtond(BufName, NULL)) == -1)
printf('Ребенок: узел '%s' не найден!
', BufName);
else
printf('Ребенок: узел '%s' найден, его nid = %i
', BufName, nid);
if ((coid =
ConnectAttach(nid, Parpid, atoi(argv[2]), _NTO_SIDE_CHANNEL, 0)) == -1) {
printf('Ребенок: странно, но дитя не смогло'
' установить канал связи с папаней
');
return(-1);
}
printf('Ребенок: установил связь coid = %i с процессом'
' Parpid = %i на узле %i
', coid, Parpid, nid);
// Вот здесь хорошее место, чтобы выполнить все действия,
// необходимые для развертывания данного процесса
itoa(CChanid, SendBuf, 10);
errno = 0;
if (MsgSend(coid, SendBuf, 100, SendBuf, 100) == -1)
printf('Ребенок: на MsgSend() к отцу получил'
' errno = %i
', errno);
else
printf('Ребенок: на MsgSend() получен отклик'
' от родителя.'%s'
', SendBuf);
rcvid = MsgReceive(CChanid, RecBuf, 100, NULL);
printf('Ребенок: от папани получено сообщение:'
' '%s'
', RecBuf);
strcpy(RecBuf, 'я здесь, папаня!');
if (MsgReply(rcvid, EOK, RecBuf, 100) == -1)
printf('Ребенок: почему-то не удалось ответить'
' папаше. Ау, где ты?
');