QNX/UNIX: Анатомия параллелизма
Шрифт:
int coid; // Идентификатор связи с порожденным
// процессом по созданному им каналу
int rcvid; // Идентификатор отправителя полученного
// сообщения int
ErrCode; // Код ошибки
char *args[] = {
"/net/904-3/home/ZZZ/BIN/TestChild",
"pid данного процесса",
"идентификатор
канала",
NULL
};
char BufName[100], Bufpid[12],
Bufchanid[12], RecBuffer[100];
char SendBuf[100] = "привет, сынок!";
pid_t procid, childid;
struct inheritance Inhproc;
setlocale(LC_CTYPE, "C-TRADITIONAL");
if ((PChanid = ChannelCreate(0)) == -1)
printf("Родитель: странно, но не удалось "
"создать канал\n");
else printf("Родитель: канал PChanid = %i создан\n", PChanid);
strcpy(BufName, "Bed-Test");
// Передаем порожденному процессу свой pid...
args[1] = itoa(procid = getpid, Bufpid, 10);
// ... и дескриптор канала
args[2] = itoa(PChanid, Bufchanid, 10);
InhProc flags = SPAWN_SETND | SPAWN_NOZOMBIE;
if ((nid = netmgr_strtond(BufName, NULL)) == -1) {
printf("Родитель, отсутствует %s\n", BufName);
return(-1);
} else printf("Родитель: найден узел %s, его nid = %i\n", BufName, nid);
InhProc nd = nid;
sprintf(BufName, "/net/Bed-Test/");
chroot(BufName);
errno = 0;
childid = spawn(args[0], 0, NULL, &InhProc, args, NULL);
ErrCode = errno;
sprintf(BufName, "/net/904-3/");
chroot(BufName);
if (childid- = -1)
printf("Родитель: не удалось породить процесс,"
" errno = %i\n", ErrCode);
else
printf("Родитель, мой id = %i,"
"порожденный
процесс имеет id = %i\n", procid, childid);
if ((rcvid = MsgReceive(PChanid, RecBuffer, 100, NULL)) == -1)
printf("Родитель: от дитятки не удалось"
" получить сообщение\n");
else {
printf("Родитель: от дитятки получено"
" сообщение:\"%s\"\n", RecBuffer);
CChanid = atoi(RecBuffer);
strcpy(RecBuffer, "спасибо, сынок");
if (MsgReply(rcvid, EOK, RecBuffer, 100) == -1)
printf("Родитель: почему-то не удалось "
"ответить сыночку: Ау, где ты?\n");
}
if ((coid =
ConnectAttach(nid, childid, CChanid, _NTO_SIDE_CHANNEL, 0)) == -1) {
printf("Родитель: странно, но не смог установить"
" канал связи с ребенком:"
"nid = %i childid = %i CChanid = %i\n", nid, childid, CChanid);
return(-1);
}
printf("Родитель: установил связь coid = %i с"
" ребенком\n", coid);
errno = 0;
if (MsgSend(coid, SendBuf, 100, SendBuf, 100) == -1)
printf("Родитель: на MsgSend получил errno = %i\n", errno);
else
printf("Родитель, получен отклик на MsgSend"
", \"%s\"\n", SendBuf);
printf("Родитель: позвольте откланяться\n");
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>
Поделиться:
Популярные книги
Не кровный Брат
Любовные романы:
эро литература
6.83
рейтинг книги
Жребий некроманта 3
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Неудержимый. Книга VI
6. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том III
3. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Баоларг
12. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Идеальный мир для Социопата 2
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Огненный князь
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Все не так, как кажется
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Не грози Дубровскому! Том V
5. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Измена. Он все еще любит!
Любовные романы:
современные любовные романы
6.00
рейтинг книги
«Три звезды» миллиардера. Отель для новобрачных
2. Три звезды
Любовные романы:
современные любовные романы
7.50
рейтинг книги
Идущий в тени 5
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Физрук 2: назад в СССР
2. Физрук
Фантастика:
попаданцы
альтернативная история
5.00