computer_knowledge_notes/Languages/CLang/libraries/semaphore.md

2.3 KiB
Raw Blame History

概述

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 *);

参考文档