Читаем UNIX Network Programming. Volume 2 Second Edition. Interprocess Communications полностью

//shm/svmsgread.c

1  #include "unpipc.h"

2  #define MAXMSG (8192 + sizeof(long))

3  int

4  main(int argc, char **argv)

5  {

6   int pipe1[2], pipe2[2], mqid;

7   char c;

8   pid_t childpid;

9   fd_set rset;

10  ssize_t n, nread;

11  struct msgbuf *buff;

12  if (argc != 2)

13   err_quit("usage: svmsgread pathname");

14  Pipe(pipe1); /* двусторонняя связь */

15  Pipe(pipe2);

16  buff = My_shm(MAXMSG); /* неименованная разделяемая память */

17  if ((childpid = Fork) == 0) {

18   Close(pipe1[1]); /* child */

19   Close(pipe2[0]);

20   mqid = Msgget(Ftok(argv[1], 0), MSG_R);

21   for(;;) {

22    /* блокируется в ожидании, извещает родительский процесс */

23    nread = Msgrcv(mqid, buff, MAXMSG, 0, 0);

24    Write(pipe2[1], nread, sizeof(ssize_t));

25    /* ожидает разрешения родительского процесса */

26    if ((n = Read(pipe1[0], c, 1)) != 1)

27     err_quit("child: read on pipe returned %d", n);

28   }

29   exit(0);

30  } /* $$.bp$$ */

31  /* parent */

32  Close(pipe1[0]);

33  Close(pipe2[1]);

34  FD_ZERO(rset);

35  FD_SET(pipe2[0], rset);

36  for(;;) {

37   if ((n = select(pipe2[0] + 1, rset, NULL, NULL, NULL)) != 1)

38    err_sys("select returned %d", n);

39   if (FD_ISSET(pipe2[0], rset)) {

40    n = Read(pipe2[0], nread, sizeof(ssize_t)); /* *INDENT-OFF* */

41    if (n != sizeof(ssize_t))

42     err_quit("parent: read on pipe returned %d", n); /* *INDENT-ON* */

43    printf("read %d bytes, type = %ld\n", nread, buff-mtype);

44    Write(pipe1[1], c, 1);

45   } else

47  }

46  err_quit("pipe2[0] not ready");

48  Kill(childpid, SIGTERM);

49  exit(0);

50 }

<p>Глава 13</p>

1. В листинге Г.8 приведен текст измененной версии листинга 12.6, а в листинге Г.9 — текст новой версии листинга 12.7. Обратите внимание, что в первой пpoгрaммe мы устанавливаем размер объекта вызовом ftruncate; lseek и write использовать для этого нельзя.

Листинг Г.8. Отображение с точным указанием размера файла

//pxshra/test1.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   int fd, i;

6   char *ptr;

7   size_t shmsize, mmapsize, pagesize;

8   if (argc != 4)

9    err_quit("usage: test1 name shmsize mmapsize");

10  shmsize = atoi(argv[2]);

11  mmapsize = atoi(argv[3]);

12  /* открываем shm: создание или урезание; установка размера */

13  fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_TRUNC,

14   FILE_MODE);

15  Ftruncate(fd, shmsize); /* $$.bp$S */

16  ptr = Mmap(NULL, mmapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

17  Close(fd);

18  pagesize = Sysconf(_SC_PAGESIZE);

19  printf("PAGESIZE = %ld\n", (long) pagesize);

20  for (i = 0; i max(shmsize, mmapsize); i += pagesize) {

21   printf("ptr[%d] = %d\n", i, ptr[i]);

22   ptr[i] = 1;

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT