信号灯/信号量 (semephore)
三种
1、posix 有名信号灯
2、posix 基于内存的信号灯(无名信号灯 ) //这个是线程用的信号量 因为无名管道就是在父子线程之间的 它也一样
3、System V信号灯(IPC对象)
进程间使用的信号灯: 1、posix 有名信号灯 使用频率不高,不做介绍
2、System V信号灯 它是一个集合一个或者多个信号灯的集合 它用于进程之间的同步控制
利用PV原语进行操作 它的函数有 :
创建信号灯:
int(key_t key,int nsems,int semflg);
参数:key ftok()函数得到 int nsems 有几个信号灯 semflg 权限 例如: IPC_CREAT | 0644
操作信号灯:
int (int semid,struct sembuf *opsptr,size_t nops);
参数:semid semget()的返回值
struct sembuf {
unsigned short sem_num; /* semaphore number */ 编号
short sem_op; /* semaphore operation */ p操作和V操作
short sem_flg; /* operation flags */一般给0
};
nops 要操作的信号灯的个数
对信号灯的控制
int semctl(int semid,int semnum,int cmd,/*union semun arg*/);
参数: semid semget返回值
semnum 控制几个信号灯
cmd IPC_RMID 删除信号灯集 SETVAL设置信号灯的值 GETVAL 获取信号灯的值
union semun arg //<linux/sem.h>中有定义
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
线程信号量(posix)
初始化sem
int sem_init(sem_t *sem,int pshared,unsigned int value);
P操作
int sem_wait(sem_t * sem); //阻塞
int sem_trywait(sem_t * sem); //非阻塞
V操作
int sem_post(sem_t * sem);
销毁sem
int sem_destroy(sem_t *sem);