Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

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

Шрифт:

В листинге 13.9 приведен текст программы-сервера, которая ожидает помещения сообщений в разделяемую память, а затем выводит их.

Листинг 13.9. Сервер, считывающий сообщения из разделяемой памяти

//pxshm/server2.c

1 #include "cliserv2.h"

2 int

3 main(int argc, char **argv)

4 {

5 int fd, index, lastnoverflow, temp;

6 long offset;

7 struct shmstruct *ptr;

8 if (argc != 2)

9 err_quit("usage: server2 <name>");

10 /* создание объекта разделяемой памяти, установка размера, отображение в память, закрытие дескриптора */

11 shm_unlink(Px_ipc_name(argv[1])); /* ошибка игнорируется */

12 fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_EXCL, FILE_MODE);

13 ptr = Mmap(NULL, sizeof(struct shmstruct), PROT_READ | PROT_WRITE,

14 MAP_SHARED, fd, 0);

15 Ftruncate(fd, sizeof(struct shmstruct));

16 Close(fd);

17 /* инициализация массива сдвигов */

18 for (index = 0; index < NMESG; index++)

19 ptr->msgoff[index] = index * MESGSIZE;

20 /* инициализация семафоров в разделяемой памяти */

21 Sem_init(&ptr->mutex, 1, 1);

22 Sem_init(&ptr->nempty, 1, NMESG);

23 Sem_init(&ptr->nstored, 1, 0);

24 Sem_init(&ptr->noverflowmutex, 1, 1);

25 /* программа-потребитель */

26 index = 0;

27 lastnoverflow = 0;

28 for (;;) {

29 Sem_wait(&ptr->nstored);

30 Sem_wait(&ptr->mutex);

31 offset = ptr->msgoff[index];

32 printf("index = %d: %s\n", index, &ptr->msgdata[offset]);

33 if (++index >= NMESG)

34 index =0; /* циклический буфер */

35 Sem_post(&ptr->mutex);

36 Sem_post(&ptr->nempty);

37 Sem_wait(&ptr->noverflowmutex);

38 temp = ptr->noverflow; /* не выводим, пока не снимем блокировку */

39 Sem_post(&ptr->noverflowmutex);

40 if (temp != lastnoverflow) {

41 printf("noverflow = %d\n", temp);

42 lastnoverflow = temp;

43 }

44 }

45 exit(0);

46 }

Создание объекта разделяемой памяти

10-16 Сначала делается вызов shm_unlink, чтобы удалить объект с тем же именем, который мог остаться после другого приложения. Затем объект разделяемой памяти создается вызовом shm_open и отображается в адресное пространство процесса вызовом mmap, после чего дескриптор объекта закрывается.

Инициализация массива сдвигов

17-19 Массив сдвигов инициализируется сдвигами сообщений.

Инициализация семафоров

20-24 Инициализируются четыре семафора, размещаемые в объекте разделяемой памяти. Второй аргумент sem_init всегда делается ненулевым, поскольку семафоры будут использоваться совместно несколькими процессами.

Ожидание сообщения, вывод его содержимого

25-36 Первая половина цикла for написана по стандартному алгоритму потребителя: ожидание изменения семафора nstored, установка блокировки для семафора mutex, обработка данных, увеличение значения семафора nempty.

Обработка переполнений

37-43 При каждом проходе цикла мы проверяем наличие возникших переполнений. Сравнивается текущее значение noverflows с предыдущим. Если значение изменилось, оно выводится на экран и сохраняется. Обратите внимание, что значение считывается с заблокированным взаимным исключением noverflowmutex, но блокировка снимается перед сравнением и выводом значения. Идея в том, что нужно всегда следовать общему правилу минимизации количества операций, выполняемых с заблокированным взаимным исключением. В листинге 13.10 приведен текст программы-клиента.

Листинг 13.10. Клиент, помещающий сообщения в разделяемую память

//pxshm/client2.c

1 #include "cliserv2.h"

2 int

3 main(int argc, char **argv)

4 {

5 int fd, i, nloop, nusec;

6 pid_t pid;

7 char mesg[MESGSIZE];

8 long offset;

9 struct shmstruct *ptr;

10 if (argc != 4)

11 err_quit("usage: client2 <name> <#loops> <#usec>");

12 nloop = atoi(argv[2]);

13 nusec = atoi(argv[3]);

14 /* открытие и отображение объекта разделяемой памяти, созданного сервером заранее */

15 fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR, FILE_MODE);

16 ptr = Mmap(NULL, sizeof(struct shmstruct), PROT_READ | PROT_WRITE,

17 MAP_SHARED, fd, 0);

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

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Хозяин Теней 5

Петров Максим Николаевич
5. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 5

Выйду замуж за спасателя

Рам Янка
1. Спасатели
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Выйду замуж за спасателя

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Кодекс Императора II

Сапфир Олег
2. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора II

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

Одержимый

Джеймс Питер
Top Thriller
Детективы:
триллеры
маньяки
8.67
рейтинг книги
Одержимый

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Я еще царь. Книга XXX

Дрейк Сириус
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще царь. Книга XXX

Черный Маг Императора 15

Герда Александр
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 15