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

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

Шрифт:

Функция sem_close

В листинге 10.30 приведен текст нашей функции sem_close, которая просто вызывает munmap для отображенного в память файла. Если вызвавший процесс продолжит пользоваться указателем, который был ранее возвращен sem_open, он получит сигнал SIGSEGV.

Листинг 10.30. Функция sem_close

//my_pxsem_mmap/sem_close. с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_close(mysem_t *sem)

5 {

6 if (sem->sem_magic != SEM_MAGIC) {

7 errno = EINVAL;

8 return(-1);

9 }

10 if (munmap(sem, sizeof(mysem_t)) == –1)

11 return(-1);

12 return(0);

13 }

Функция sem_unlink

Текст функции sem_unlink приведен в листинге 10.31. Она просто удаляет файл, через который реализован данный семафор, вызывая функцию unlink.

Листинг 10.31. Функция sem_unlink

//my_pxsem_mmap/sem_unlink.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_unlink(const char *pathname)

5 {

6 if (unlink(pathname) == –1)

7 return(-1);

8 return(0);

9 }

Функция sem_post

В листинге 10.32 приведен текст функции sem_post, которая увеличивает значение семафора, возобновляя выполнение всех процессов, заблокированных в ожидании этого события.

Листинг 10.32. Функция sem_post

//my_pxsem_mmap/sem_post.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_post(mysem_t *sem)

5 {

6 int n;

7 if (sem->sem_magic != SEM_MAGIC) {

8 errno = EINVAL;

9 return(-1);

10 }

11 if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {

12 errno = n;

13 return(-1);

14 }

15 if (sem->sem_count == 0)

16 pthread_cond_signal(&sem->sem_cond);

17 sem->sem_count++;

18 pthread_mutex_unlock(&sem->sem_mutex);

19 return(0);

20 }

11-18 Прежде чем работать со структурой, нужно заблокировать соответствующее взаимное исключение. Если значение семафора изменяется с 0 на 1, нужно вызвать pthread_cond_signal, чтобы возобновилось выполнение одного из процессов, зарегистрированных на уведомление по данной условной переменной.

Функция sem_wait

В листинге 10.33 приведен текст функции sem_wait, которая ожидает изменения значения семафора с 0 на положительное, после чего уменьшает его на 1.

Листинг 10.33. Функция sem_wait

//my_pxsem_mmap/sem_wait.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_wait(mysem_t *sem)

5 {

6 int n;

7 if (setn->sem_magic != SEM_MAGIC) {

8 errno = EINVAL;

9 return(-1);

10 }

11 if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {

12 errno = n;

13 return(-1);

14 }

15 while (sem->sem_count == 0)

16 pthread_cond_wait(&sem->sem_cond, &sem->sem_mutex);

17 sem->sem_count--;

18 pthread_mutex_unlock(&sem->sem_mutex);

  • Читать дальше
  • 1
  • ...
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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