System V IPC对象 - 信号灯
1.信号灯也叫信号量,用于进程/线程同步或互斥的机制
2.信号灯的类型
Posix无名信号灯
Posix有名信号灯
System V信号灯
Posix无名信号量,主要用于线程间同步,存在于内存没有实际的文件系统可见的文件,System V IPC信号量本节要介绍的,有实际的文件系统可见的文件但数据依然是存在内存,文件只是用来找到这个信号量用的,所以可以用于进程间同步。
3.信号灯的含义
- 计数用的,信号灯的值就是信号灯代表的资源的数量
- System V信号灯是一个或多个计数信号灯的集合
- 可同时操作集合中的多个信号灯,要操作就是操作集合内的所有信号量而不是单独的一个信号量
- 申请多个资源时避免死锁
信号灯集合避免死锁图示:

System V信号灯使用步骤
- 打开/创建信号灯semget
1 |
|
IPCEXCL标志位:如果信号灯已经本创建了,semget()函数会返回EOF并设置全局的errno,所以就可以通过semget()的返回值判断信号量是否已经被创建,已经被创建就不执行信号量的初始化工作,没有被创建semget()成功并返回信号灯id此时就应该去初始化新创建的这个信号灯。
- 信号灯初始化semctl
1 |
|
semctl()函数如果地三个参数是SETVAL,需要传入第四个参数是一个共用体需要自己定义:
1 | union semun |
信号灯初始化示例:
要求:假设信号灯集合中包含两个信号灯;第一个初始化
为2,第二个初始化为0
1 | union semun myun; |
小结:
1.System V信号灯实际上是多个计数信号灯的集合
2.semget()用于创建一个信号灯,通过它的返回值来判断信号灯是否已经被创建了,如果之前没有被创建,就需要初始化新创建的信号灯,如果之前已经创建了就不能再初始化信号灯。
3.semctl()用于初始化、删除信号灯
P/V操作semop
1 |
|
描述信号灯的结构体(系统已经定义好不需要自己定义):struct sembuf
1 | struct sembuf |
- 删除信号灯semctl