Linux的信号量有三类:
- 操作系统自身使用的信号量(位于linux-2.6.34/kernel/semaphore.c)
- SystemV信号量(位于linux-2.6.34/ipc/sem.c)
- POSIX信号量(位于C语言库,例如glibc)
本文的主题是SystemV信号量。
信号量的三个系统调用
- semget (key_t key, int nsems, int semflg) 创建或打开一个信号量
- semctl (int semid, int semnum, int cmd, ...) 信号量的控制
- semop (int semid, struct sembuf *sops, size_t nsops) 信号量的PV操作
示例代码如下:
/* 信号量三个系统调用的使用示例 */
#include <stdio.h>
#include <sys/sem.h>
int main() {
key_t key;
int semid, nsems;
struct sembuf sem_ops[2];
// 创建一个唯一的key值
key = ftok("/tmp", 'R');
// 创建一个信号量集合,其中包含3个信号量
nsems = 3;
semid = semget(key, nsems, IPC_CREAT | 0666);
// 初始化3个信号量的值都为1
short val[] = {1, 1, 1};
semctl(semid, 0, SETALL, val);