//===================信号量=============
信号量:主要来实现进程间或线程间的同步(也可以实现互斥)
信号量的值:表示资源的可用量。
信号量操作流程:
1:创建一个信号量集合
param 2:信号量集合中信号量的个数
int semid
int semget(key_t key, int nsems, int semflg);
semid = semget(key, 1, IPC_CREAT|0666);
2:对信号量进行初始化
param 2:要操作的信号量在集合中的下标
param 3:你要进行什么操作,就选择什么命令
int semctl(int semid, int semnum, int cmd, ...);
1)、完成对信号量集的初始化(单个信号量:cmd = SETVAL, 多个信号量同时初始化:cmd = SETALL)
2)、获取信号量的值(cmd = GETVAL)
3)、删除信号量集(cmd = IPC_RMID)
//需要用户自己定义
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*/
};
//将信号量集合中第一个sem的值初始化为1
union semun sem_p;
sem_p.val = 1;
semctl(semid, 0, SETVAL, sem_p);
//将信号量集中两个信号量:sem1和sem2的值分别初始化为10和5
union semun sem_p;
unsigned short array_sem[2];
array_sem[0] = 10;
array_sem[1] = 5;
sem_p.array = array_sem;
semctl(semid, 0, SETALL, sem_p);
//获取信号量集中下标为1的信号量的值;
int val;
union semun sem_p;
unsigned short array_sem[2];
sem_p.array = array_sem;
val = semctl(semid, 1, GETVAL); //获取一个信号量的值
semctl(semid, 0, GETALL, sem_p);//一次可以获取多个信号量的值
3:实现PV 函数
//==================PV操作===========================================
param 2:实现PV操作的控制
param 3:实现PV操作的信号量的个数
int semop(int semid, struct sembuf *sops, unsigned nsops);
//该结构体不需要用户自定义
struct sembuf {
unsigned short sem_num; /* 下标*/
short sem_op; /* -1:P操作 1:V操作 */
short sem_flg; /*一般填0 */
};
//实现sem信号量的p操作
struct sembuf buf;
buf.sem_num = 0;//下标
buf.sem_op = -1;
buf.sem_flg = 0;
semop(semid, &buf, 1);
//实现sem信号量的V操作
struct sembuf buf;
buf.sem_num = 0;//下标
buf.sem_op = 1;
buf.sem_flg = 0;
semop(semid, &buf, 1);
//将信号量集中两个信号量:sem1实现P操作、sem2实现V操作。
struct sembuf buf[2];
buf[0].sem_num = 0;//下标
buf[0].sem_op = -1;
buf[0].sem_flg = 0;
buf[1].sem_num = 1;//下标
buf[1].sem_op = 1;
buf[1].sem_flg = 0;
semop(semid, buf, 2);
4:在适当地方进行PV操作
5:删除信号量集
semctl(semid, 0, IPC_RMID);