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

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

Жанры

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

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

Шрифт:

10.15. Реализация с помощью отображения в память

Теперь займемся реализацией именованных семафоров Posix с помощью отображаемых в память файлов вместе со взаимными исключениями и условными переменными Posix. Реализация, аналогичная данной, приведена в разделе В.11.3 Обоснования стандарта IEEE 1996 [8].

ПРИМЕЧАНИЕ

Отображаемые в память файлы описаны в главах 12 и 13. Данный раздел можно отложить, с тем чтобы вернуться к нему после прочтения этих глав. 

Прежде всего приведем текст нашего заголовочного файла semaphore.h (листинг 10.27), в котором определяется фундаментальный тип sem_t.

Тип sem_t

1-7 Структура данных семафора содержит взаимное исключение, условную переменную и беззнаковое целое, в котором хранится текущее значение семафора. Как уже говорилось в связи с листингом 10.21, поле sem_magiс получает значение SEM_MAGIC при инициализации структуры.

Листинг 10.27. Заголовочный файл semaphore.h

//my_pxsem_mmap/semaphore.h

1 /* фундаментальный тип */

2 typedef struct {

3 pthread_mutex_t sem_mutex; /* блокируется при проверке и изменении значения семафора */

4 pthread_cond_t sem_cond; /* при изменении нулевого значения */

5 unsigned int sem_count; /* значение семафора */

6 int sem_magic; /* магическое значение, если семафор открыт */

7 } mysem_t;

8 #define SEM_MAGIC 0x67458923

9 #ifdef SEM_FAILED

10 #undef SEM_FAILED

11 #define SEM_FAILED ((mysem_t *)(-1)) /* чтобы избежать предупреждений компилятора */

12 #endif

Функция sem_open

В листинге 10.28 приведен текст первой части функции sem_open, которая может использоваться для создания нового семафора или открытия существующего.

Листинг 10.28. Функция sem_open: первая половина

//my_pxsem_mmap/sem_open.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 #include <stdarg.h> /* для списков аргументов переменной длины */

4 #define MAX_TRIES 10 /* количество попыток инициализации */

5 mysem_t *

6 mysem_open(const char *pathname, int oflag, …)

7 {

8 int fd, i, created, save_errno;

9 mode_t mode;

10 va_list ap;

11 mysem_t *sem, seminit;

12 struct stat statbuff;

13 unsigned int value;

14 pthread_mutexattr_t mattr;

15 pthread_condattr_t cattr;

16 created = 0;

17 sem = MAP_FAILED; /* [sic] */

18 again:

19 if (oflag & O_CREAT) {

20 va_start(ap, oflag); /* ар инициализируется последним явно указанным аргументом */

21 mode = va_arg(ap, va_mode_t) & ~S_IXUSR;

22 value = va_arg(ap, unsigned int);

23 va_end(ap);

24 /* открываем с указанием флага O_EXCL и установкой бита user-execute */

25 fd = open(pathname, oflag | O_EXCL | O_RDWR, mode | S_IXUSR);

26 if (fd < 0) {

27 if (errno == EEXIST && (oflag & O_EXCL) == 0)

28 goto exists; /* уже существует. OK */

29 else

30 return(SEM_FAILED);

31 }

32 created = 1;

33 /* кто создает файл, тот его и инициализирует */

34 /* установка размера файла */

35 bzero(&seminit, sizeof(seminit));

36 if (write(fd, &seminit, sizeof(seminit)) != sizeof(seminit))

37 goto err;

38 /* отображение файла в память */

39 sem = mmap(NULL, sizeof(mysem_t), PROT_READ | PROT_WRITE,

40 MAP_SHARED, fd, 0);

41 if (sem == MAP_FAILED)

42 goto err;

43 /* инициализация взаимного исключения, условной переменной, значения семафора */

44 if ((i = pthread_mutexattr_init(&mattr)) != 0)

45 goto pthreaderr;

46 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

47 i = pthread_mutex_init(&sem->sem_mutex, &mattr);

48 pthread_mutexattr_destroy(&mattr); /* не забыть удалить */

49 if (i != 0)

50 goto pthreaderr;

51 if ((i = pthread_condattr_init(&cattr)) != 0)

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

Кодекс Крови. Книга ХIII

Борзых М.
13. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIII

Травница Его Драконейшества

Рель Кейлет
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Травница Его Драконейшества

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Французская новелла XX века. 1900–1939

Пруст Марсель
Проза:
классическая проза
6.25
рейтинг книги
Французская новелла XX века. 1900–1939

Родословная. Том 2

Ткачев Андрей Юрьевич
2. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 2

Бастард Императора. Том 9

Орлов Андрей Юрьевич
9. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 9

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

Целого Мира Мало

Джиллиан Алекс
Любовные романы:
современные любовные романы
8.88
рейтинг книги
Целого Мира Мало

Гранд

Демченко Антон Витальевич
3. Воздушный стрелок
Фантастика:
боевая фантастика
8.12
рейтинг книги
Гранд

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Ермак. Телохранитель