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

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

Шрифт:

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 sem_t *sem;

6 int val;

7 if (argc != 2)

8 err_quit("usage: semwait <name>");

9 sem = Sem_open(argv[1], 0);

10 Sem_wait(sem);

11 Sem_getvalue(sem, &val);

12 printf("pid %ld has semaphore, value = %d\n", (long) getpid, val);

13 pause; /* блокируется, пока не будет удален */

14 exit(0);

15 }

Программа sempost

В листинге 10.7 приведена программа, которая выполняет операцию post для указанного семафора (то есть увеличивает его значение на 1), а затем получает значение этого семафора и выводит его.

Листинг 10.7. Увеличение значения семафора

//pxsem/sempost.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 sem_t *sem;

6 int val;

7 if (argc != 2)

8 err_quit("usage: sempost <name>");

9 sem = Sem_open(argv[1], 0);

10 Sem_post(sem);

11 Sem_getvalue(sem, &val);

12 printf("value = %d\n", val);

13 exit(0);

14 }

Примеры

Для начала мы создадим именованный семафор в Digital Unix 4.0B и выведем его значение, устанавливаемое по умолчанию при инициализации:

alpha % semcreate /tmp/test1

alpha % ls-l /tmp/test1

– rw-r--r-- 1 rstevens system 264 Nov 13 08:51 /tmp/test1

alpha %semgetvalue /tmp/test1

value = 1

Аналогично очередям сообщений Posix система создает файл семафора с тем именем, которое мы указали при вызове функции.

Теперь подождем изменения семафора и прервем работу программы, установившей блокировку:

alpha % semwait /tmp/test1

pid 9702 has semaphore, value = 0 значение после возврата из sem_wait

^? клавиша прерывания работы в нашей системе

alpha % semgetvalue /tmp/test1

value = 0 значение остается нулевым

Приведенный пример иллюстрирует упомянутые ранее особенности. Во-первых, значение семафора обладает живучестью ядра. Значение 1, установленное при создании семафора, хранится в ядре даже тогда, когда ни одна программа не пользуется этим семафором. Во-вторых, при выходе из программы semwait, заблокировавшей семафор, значение его не изменяется, то есть ресурс остается заблокированным. Это отличает семафоры от блокировок fcntl, описанных в главе 9, которые снимались автоматически при завершении работы процесса.

Покажем теперь, что в этой реализации отрицательное значение семафора используется для хранения информации о количестве процессов, ожидающих разблокирования семафора:

alpha % semgetvalue /tmp/test1

value = 0 это значение сохранилось с конца предыдущего примера

alpha % semwait /tmp/test1 & запуск в фоновом режиме

[1] 9718 блокируется в ожидании изменения значения семафора

alpha % semgetvalue /tmp/test1

value = –1 один процесс ожидает изменения семафора

alpha % semwait /tmp/test1 & запуск еще одного процесса в фоновом режиме

[2] 9727 он также блокируется

alpha % semgetvalue /tmp/test1

value = –2 два процесса ожидают изменения семафора

  • Читать дальше
  • 1
  • ...
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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