Олег Цилюрик - QNX/UNIX - Анатомия параллелизма

Здесь есть возможность читать онлайн «Олег Цилюрик - QNX/UNIX - Анатомия параллелизма» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2006, ISBN: 2006, Издательство: Символ-Плюс, Жанр: Программирование, ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

QNX/UNIX: Анатомия параллелизма: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «QNX/UNIX: Анатомия параллелизма»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса. Некоторые из результатов испытаний тестовых примеров будут большим сюрпризом даже для самых бывалых программистов. Тем не менее излагаемые техники вполне доступны и начинающим программистам: для изучения материала требуется базовое знание языка программирования C/C++ и некоторое понимание «устройства» современных многозадачных ОС UNIX.
В качестве «испытательной площадки» для тестовых фрагментов выбрана ОСРВ QNX, что позволило с единой точки зрения взглянуть как на специфические механизмы микроядерной архитектуры QNX, так и на универсальные механизмы POSIX. В этом качестве книга может быть интересна и тем, кто не использует (и не планирует никогда использовать) ОС QNX: программистам в Linux, FreeBSD, NetBSD, Solaris и других традиционных ОС UNIX.

QNX/UNIX: Анатомия параллелизма — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «QNX/UNIX: Анатомия параллелизма», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

"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

#include

#include

#include

#include

#include

#include

#include

#include

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("Ребенок: странно, но не удалось создать"

" канал\n");

else

printf("Ребенок: канал CChanid = %i создан\n", CChanid);

Parpid = atoi(argv[1]);

printf("Ребенок сообщает: он жив благодаря папане"

" Parpid = %i\n", Parpid);

strcpy(BufName, "904-3");

if ((nid = netmgr_strtond(BufName, NULL)) == -1)

printf("Ребенок: узел \"%s\" не найден!\n", BufName);

else

printf("Ребенок: узел \"%s\" найден, его nid = %i\n", BufName, nid);

if ((coid =

ConnectAttach(nid, Parpid, atoi(argv[2]), _NTO_SIDE_CHANNEL, 0)) == -1) {

printf("Ребенок: странно, но дитя не смогло"

" установить канал связи с папаней\n");

return(-1);

}

printf("Ребенок: установил связь coid = %i с процессом"

" Parpid = %i на узле %i\n", coid, Parpid, nid);

// Вот здесь хорошее место, чтобы выполнить все действия,

// необходимые для развертывания данного процесса

itoa(CChanid, SendBuf, 10);

errno = 0;

if (MsgSend(coid, SendBuf, 100, SendBuf, 100) == -1)

printf("Ребенок: на MsgSend() к отцу получил"

" errno = %i\n", errno);

else

printf("Ребенок: на MsgSend() получен отклик"

" от родителя.\"%s\"\n", SendBuf);

rcvid = MsgReceive(CChanid, RecBuf, 100, NULL);

printf("Ребенок: от папани получено сообщение:"

" \"%s\"\n", RecBuf);

strcpy(RecBuf, "я здесь, папаня!");

if (MsgReply(rcvid, EOK, RecBuf, 100) == -1)

printf("Ребенок: почему-то не удалось ответить"

" папаше. Ау, где ты?\n");

printf("Ребенок: дитятко работу закончило\n");

ChannelDestroy(CChanid);

ConnectDetach(coid);

return(0);

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «QNX/UNIX: Анатомия параллелизма»

Представляем Вашему вниманию похожие книги на «QNX/UNIX: Анатомия параллелизма» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «QNX/UNIX: Анатомия параллелизма»

Обсуждение, отзывы о книге «QNX/UNIX: Анатомия параллелизма» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x