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

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

Шрифт:

Функция sem_close

В листинге 10.39 приведен текст функции sem_close, которая вызывает free для освобождения динамически выделенной под структуру sem_t памяти. 

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

//my_pxsem_svsem/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 sem->sem_magic = 0; /* на всякий случай */

11 free(sem);

12 return(0);

13 }

Функция sem_unlink

Функция sem_unlink, текст которой приведен в листинге 10.40, удаляет вспомогательный файл и семафор System V, связанные с указанным ей семафором Posix.

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

//my_pxsem_svsem/sem_unlink.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_unlink(const char *pathname)

5 {

6 int semid;

7 key_t key;

8 if ((key = ftok(pathname, 0)) == (key_t) –1)

9 return(-1);

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

11 return(-1);

12 if ((semid = semget(key, 1, SVSEM_MODE)) == –1)

13 return(-1);

14 if (semctl(semid, 0, IPC_RMID) == –1)

15 return(-1);

16 return(0);

17 }

Получение ключа System V по полному имени

8-16 Функция ftok преобразует полное имя файла в ключ System V IPC. После этого вспомогательный файл удаляется вызовом unlink (именно в этом месте кода, на тот случай, если одна из последующих функций вернет ошибку). Затем мы открываем семафор System V вызовом semget и удаляем его с помощью команды IPC_RMID для semctl.

Функция sem_post

В листинге 10.41 приведен текст функции sem_post, которая увеличивает значение семафора.

11-16 Мы вызываем semop с операцией, увеличивающей значение семафора на 1.

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

//my_pxsem_svsem/sem_post.с

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_post(mysem_t *sem)

5 {

6 struct sembuf op;

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

8 errno * EINVAL;

9 return(-1);

10 }

11 op.sem_num = 0;

12 op.sem_op = 1;

13 op.sem_flg = 0;

14 if (semop(sem->sem_semid, &op, 1) < 0)

15 return(-1);

16 return(0);

17 }

Функция sem_wait

Следующая функция приведена в листинге 10.42; она называется sem_wait и ожидает изменения значения семафора с нулевого на ненулевое, после чего уменьшает значение семафора на 1.

11-16 Мы вызываем semop с операцией, уменьшающей значение семафора на 1.

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

//my_pxsem_svsem/sem_wait.c

1 #include "unpipc.h"

2 #include "semaphore.h"

3 int

4 mysem_wait(mysem_t *sem)

5 {

6 struct sembuf op;

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

8 errno = EINVAL;

9 return(-1);

10 }

11 op.sem_num = 0;

12 op.sem_op = –1;

13 op.sem_flg = 0;

14 if (semop(sem->sem_semid, &op, 1) < 0)

15 return(-1);

  • Читать дальше
  • 1
  • ...
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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