1.产生背景:有些资源呗多个进程同时访问的时候,可能出现数据混乱的现象
2.定义:信号量有名信号灯。主要是用来保护临界资源(进程互斥)。进程可以根据他判定是否可以访问临界资源。还可以用于进程同步。
实质:一个数字
操作:获取和释放。利用信号量的值判断是否可以操作,大于0可以。0不可以。所以在创建操作之前一般要保证初始值是1.可以使用semctl函数来获取和设置初始值。
3.分类:
(1)二值信号量:信号灯的值只能是0和1
(2)计数信号量:信号灯的值可以取任意非负值
4.和文件的区别
(1)打开信号量得到标识符
(2)利用标识符操作信号量
5.键值:类似于文件名,要打开一个文件你要知道她的文件名,所以要打开一个信号量要知道他所属的键值。
键值指向一个信号量集合。
性质:就是一个数字,在打开信号量之前就有了。
作用:表明信号量。
指定键值:
(1)任意选择一个数
有可能被其他IPC对象用了,所以无效。
(2)ftok函数(文件名(实质是数字),项目ID)
利用文件名(Linux内核指定实际数字)和项目ID共同构造信号量集合的键值。返回的是key_t类型。
5.函数学习:
8.1 创建/打开信号量集合
8.1.1 函数名
Semget
8.1.2 函数原形
int semget(key_t key, int nsems, int semflg);
8.1.3 函数功能
获取信号量集合的标识符
当key所指定的的信号量不存在的时候,且semflg里面包含了IPC_CREAT,则会创建一个信号量集合
8.1.4 所属头文件
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
8.1.5 返回值
成功:信号量集合标识符
失败:-1
8.1.6 参数说明
Key:键值(对应于信号量集合)
Nsems:创建的信号量集合里包含的信号量数目。
Semflg:标志,可以取IPC_CREAT标志。
8.1.7 范例代码
8.2 操作信号量
8.2.1 函数名
Semop
8.2.2 函数原形
int semop(int semid, struct sembuf *sops, unsigned nsops);
8.2.3 函数功能
操作信号量
8.2.4 所属头文件
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
8.2.5 返回值
成功:0
失败:-1
8.2.6 参数说明
Semid:要操作的信号量集合的标志符(由semget返回的)
Sops:执行什么操作(实质是一个数组,长度由Nsops指定)
unsigned short sem_num;指明要操作哪一个信号量
short sem_op; 正数就是释放,负数就是获取
short sem_flg;不关心
Nsops:要操作多少信号量
6.具体操作
(0)创建键值(两个进程都要指定键值,只要知道文件名和项目ID即可。)
(1)创建并打开信号量,返回int(如果已存在,则不会再次创建)
(2)打开文件
(3)获取信号量,获取失败则等待就是用操作信号量函数。注意对sops结构体的定义。
(4)访问文件(资源)
(5)释放信号量
(6)关闭文件