什么是信号量
用来保护公共资源,使得资源在一个时刻只能有一个进程使用。
信号量值为正的时候,说明他空闲;若为0,说明被占有,测试线程要进入睡眠队列中,等待被唤醒。
wait(S)S=S-1;如果S>=0,正常运行,S<0进入等待队列
singnal(S)S=S+1 S>0正常运行,如果S<=0,在等待队列中选择一个进程使其继续运行。
linux提供的两种信号量
1.内核信号量:由内核控制路径使用
2.用户态进程使用的信号量
1)POSIX信号量:分为有名信号量和无名信号量。有名信号量值保存在文件中,可以用于线程和进程间的同步。无名信号量保存在内存中用于线程同步。
引用的头文件:<semaphore.h>
2)system v信号量:一个或多个信号量的集合,对应的是一个信号量集体,常用于进程同步。
引用的头文件:<sys/sem.h>
linux 信号量集操作函数:
1.semget
int semget(key_t key,int nsems,int semflg)创建或打开一个已创建的信号量集,执行成功会返回信号量的ID否则返回-1
key:创建或打开的信号量集的键值,常用IPC_PRIVATE由系统分配。
nsems 新建信号量集中的信号量个数,通常为1。
semflg:对信号量集合进行打开或存取
IPC_CREAT:创建
IPC_EXCL:要和creat结合使用,要么创建一个新的集合,要么对已经存在的集合返回-1
2.semop
int semop(int semid,struct sembuf *sops,unsigned nsops) 对信号量集中的信号量进行指定的操作。借助sembuf增加或减少信号量的值,执行成功返回0,否则返回-1;
semid:信号量集的id
sops:数组类型
nsops:sops数组大小
3.semctl
int semctl(int semid,int semnum,int cmd);
semnum索引量的标识
cmd要执行的命令
sembuf
struct sembuf sem_b;
sem_b.sem_num = 0;//操作的信号量在信号量集中的索引值
sem_b.sem_op= -1;负数表示p操作,正数表示v操作
sem_b.sem_flg=SEM_UNDO;//操作标志,sem_undo
进程意外结束时恢复信号量的操作。
网友评论