目录
- 一、信号灯集
- 1.1 概念
- 1.2 信号灯集创建步骤⭐⭐⭐
- 1.3 信号灯集对应函数
- 二、消息队列
一、信号灯集
1.1 概念
信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。
通过信号灯集实现共享内存的同步操作。
1.2 信号灯集创建步骤⭐⭐⭐
- 创建key值 ftok
- 创建或打开信号灯集 semget
- 初始化信号灯:semctl
- PV操作:semop
- 删除信号灯集 :semctl
1.3 信号灯集对应函数
-
semget
int semget(key_t key, int nsems, int semflg);- 功能:创建/打开信号灯
- 参数:
- key:ftok产生的key值
- nsems:信号灯集中包含的信号灯数目
- semflg:信号灯集的访问权限,通常为
IPC_CREAT | IPC_EXCL |0666
- 返回值:
- 成功:信号灯集ID
- 失败:-1
例:创建或打开信号灯集 ↓
运行:
🚨注意:第一次创建信号灯集,semid为0,不能用,要排除。故第一次创建完之后要删除semid为0的信号灯集,重新创建。
查看系统当前信号灯集:ipcs -s
删除系统信号灯集:ipcrm -s semid -
semctl
int semctl ( int semid, int semnum, int cmd…/*union semun arg*/);- 功能:信号灯集合的控制(初始化/删除)
- 参数:
- semid:信号灯集ID
- semnum: 要操作的集合中的信号灯编号
- cmd:
- GETVAL:获取信号灯的值,返回值是获得值
- SETVAL:设置信号灯的值,需要用到第四个参数:共用体
- IPC_RMID:从系统中删除信号灯集合
- 返回值:成功 0;失败 -1
用法:第四个参数是一个共用体,需自己创建,共用体第一个参数就是信号灯的值
union semun{
int val;
}mysemun;
mysemun.val = 10;
semctl(semid, 0, SETVAL, mysemun);
获取信号灯值:函数semctl(semid, 0, GETVAL)的返回值