Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

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.

Глава 11

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

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

…

> semid = atol(argv[optind]);

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

Глава 12

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 <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)) {

  • Читать дальше
  • 1
  • ...
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: