Книга: UNIX: взаимодействие процессов
Функция sem_wait
Функция sem_wait
Последняя функция для работы с именованными семафорами Posix — sem_wait. Ее текст приведен в листинге 10.26.
Листинг 10.26. Функция sem_wait
//my_pxsem_fifo/sem_wait.с
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_wait(mysem_t *sem)
5 {
6 char c;
7 if (sem->sem_magic != SEM_MAGIC) {
8 errno = EINVAL;
9 return(-1);
10 }
11 if (read(sem->sem_fd[0], &c, 1) == 1)
12 return(0);
13 return(-1);
14 }
11-12 Мы считываем 1 байт из канала FIFO, причем работа приостанавливается, если канал пуст.
Мы еще не реализовали функцию sem_trywait, но это можно сделать, установив флаг отключения блокировки для канала и используя обычный вызов read. Мы также не реализовали функцию sem_getvalue. В некоторых реализациях при вызове функции stat или fstat возвращается количество байтов в именованном или неименованном канале, причем оно помещается в поле st_size структуры stat. Однако это не гарантируется стандартом Posix и, следовательно, не обязательно будет работать в других системах. Пример реализации этих двух функций для работы с семафорами Posix приведен в следующем разделе.
- Функция sem_unlink
- Функция sem_close
- 10.3. Функции sem_wait и sem_trywait
- Функция sem_trywait
- 10.16. Реализация с использованием семафоров System V
- Синхронизация с помощью семафоров
- Мьютексы
- 10.14. Реализация с использованием FIFO
- 10.9. Несколько производителей, один потребитель
- Листинг 3.2. (system.c) Использование функции system()