2.3 KiB
2.3 KiB
概述
glibc提供了两种类型的信号量:POSIX信号量和SYS V信号量。在semaphore.h
里提供的是POSIX信号量,即本文件描述的是POSIX信号量。POSIX信号量又分两种:无名信号量和有名信号量。
无名信号量
无名信号量的数据类型sem_t
定义在bits/semaphore.h。
#if __WORDSIZE == 64
# define __SIZEOF_SEM_T 32
#else
# define __SIZEOF_SEM_T 16
#endif
typedef union
{
char __size[__SIZEOF_SEM_T];
long int __align;
} sem_t;
有名信号量
有名信号量的值保存在文件中。
相关函数
有名信号量
/* 销毁一个无名信号量 */
int sem_destroy(sem_t *);
/* 获取信号量的值 */
int sem_getvalue(sem_t *__restrict, int *__restrict);
/* 初始化一个无名信号量 */
int sem_init(sem_t *, int, unsigned);
/* 给一个信号量解锁。即V操作,释放资源。
* 注:有名信号量和无名信号量共用此函数。
*/
int sem_post(sem_t *);
/* 给信号量上锁。即P操作,申请资源。
* 注:有名信号量和无名信号量共用此函数。
*/
int sem_wait(sem_t *);
int sem_timedwait(sem_t *__restrict, const struct timespec *__restrict);
int sem_trywait(sem_t *);
无名信号量
/* 打开一个有名信号量。 */
sem_t *sem_open(const char *, int, ...);
/* 关闭一个有名信号量。 */
int sem_close(sem_t *);
/* 删除一个有名信号量。 */
int sem_unlink(const char *);
参考文档
-
man 7 sem_overview