进程间通信IPC——信号量

//===================信号量=============

信号量:主要来实现进程间或线程间的同步(也可以实现互斥)

信号量的值:表示资源的可用量。

 

信号量操作流程:

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);

//将信号量集中两个信号量:sem1sem2的值分别初始化为105

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值