Книга: UNIX: взаимодействие процессов
Функция sem_trywait
Функция sem_trywait
В листинге 10.34 приведен текст функции sem_trywait, которая представляет собой просто неблокируемый вариант функции sem_wait.
11-22 Мы блокируем взаимное исключение и проверяем значение семафора. Если оно положительно, мы вычитаем из него 1 и возвращаем вызвавшему процессу код 0. В противном случае возвращается –1, а переменной errno присваивается код ошибки EAGAIN.
Листинг 10.34. Функция sem_trywait
//my_pxsem_nmap/sem_trywait.с
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_trywait(mysem_t *sem)
5 {
6 int n, rc;
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 sem->sem_count--;
17 rc = 0;
18 } else {
19 rc = –1;
20 errno = EAGAIN;
21 }
22 pthread_mutex_unlock(&sem->sem_mutex);
23 return(rc);
24 }