Читаем UNIX: взаимодействие процессов полностью

Листинг Г.6. Возвращает ли sem_wait ошибку EINTR?

//pxsem/testeintr.c

1  #include "unpipc.h"

2  #define NAME "testeintr"

3  static void sig_alrm(int);

4  int

5  main(int argc, char **argv)

6  {

7   sem_t *sem1, sem2;

8   /* именованный семафор */

9   sem_unlink(Px_ipc_name(NAME));

10  sem1 = Sem_open(Px_ipc_name(NAME), O_RDWR | O_CREAT | О_EXCL,

11   FILE_MODE, 0);

12  Signal(SIGALRM, sig_alrm);

13  alarm(2);

14  if (sem_wait(sem1) == 0)

15   printf("sem_wait returned 0?\n");

16  else

17   err_ret("sem_wait error");

18  Sem_close(sem1);

19  /* размещаемый в памяти семафор */

20  Sem_init(&sem2, 1, 0);

21  alarm(2);

22  if (sem_wait(&sem2) == 0)

23   printf("sem_wait returned 0?\n");

24  else

25   err_ret("sem_wait error");

26  Sem_destroy(&sem2);

27  exit(0);

28 }

29 static void

30 sig_alrm(int signo)

31 {

32  printf("SIGALRM caught\n");

33  return;

34 }

Реализация с использованием FIFO возвращает EINTR, поскольку sem_wait блокируется в вызове read, который должен возвращать такую ошибку. Реализация с использованием отображения в память ошибки не возвращает, поскольку sem_wait блокируется в вызове pthread_cond_wait, а эта функция не возвращает такой ошибки. Реализация с использованием семафоров System V возвращает ошибку EINTR, поскольку sem_wait блокируется в вызове semop, которая возвращает эту ошибку.

9. Реализация с использованием каналов (листинг 10.25) является защищенной, поскольку таковой является операция write. Реализация с отображением в память защищенной не является, поскольку функции pthread_XXX не являются защищенными и не могут вызываться из обработчика сигналов. Реализация с семафорами System V (листинг 10.41) также не является защищенной, поскольку semop не является защищенной функцией согласно Unix 98.

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

1. Нужно изменить только одну строку:

< semid = Semget(Ftok(argv[optind], 0), 0, 0);

> semid = atol(argv[optind]);

2. Вызов ftok вернет ошибку, что приведет к завершению работы обертки Ftok. Функция my_lock могла бы вызывать ftok перед semget, проверять, не возвращается ли ошибка ENOENT, а затем создавать файл, если он не существует.

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

1. Размер файла увеличится еще на 4096 байт (до 36864), но обращение к новому концу файла (36863) может привести к отправке сигнала SIGSEGV, поскольку размер области отображения в памяти равен 32768 байт. Причина, по которой мы говорим «может», а не «должен», — в неопределенности размера страницы памяти.

2. На рис. Г.1 показана схема с очередью сообщений System V, а на рис. Г.2 — с очередью сообщений Posix. Вызовы memcpy в отправителе происходят внутри функций mq_send (листинг 5.26), а в получателе — внутри mq_receive (листинг 5.28).

Рис. Г.1. Отправка сообщений в очередь System V

Рис. Г.2. Отправка сообщений через очередь Posix, реализованную с mmap

3. Любой вызов read для /dev/zero возвращает запрошенное количество нулей. Данные, помещаемые в этот файл, попросту сбрасываются (аналогично /dev/null).

4.  В результате в файле получится 4 байта — все нули (предполагается 32-разрядное целое).

5. В листинге Г.7 приведен текст нашей программы.

Листинг Г.7. Использование select с очередями System V

//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 ");

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]);

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

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных