Книга: UNIX: взаимодействие процессов
Функция sem_trywait
Функция sem_trywait
В листинге 10.43 приведен текст нашей функции sem_trywait, которая представляет собой неблокируемую версию sem_wait.
13 Единственное отличие от функции sem_wait из листинга 10.42 заключается в том, что флагу sem_flg присваивается значение IPC_NOWAIT. Если операция не может быть завершена без блокирования вызвавшего потока, функция semop возвращает ошибку EAGAIN, а это именно тот код, который должен быть возвращен sem_trywait, если операция не может быть завершена без блокирования потока.
Листинг 10.43. Функция sem_trywait
//my_pxsem_svsem/sem_trywait.c
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_trywait(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 = IPC_NOWAIT;
14 if (semop(sem->sem_semid, &op, 1) < 0)
15 return(-1);
16 return(0);
17 }