信号量的使用规则

信号量

信号量不是一种通信方式,只是一个处理互斥,一般用于共享内存互斥
将信号量处理过程比作停车,有车位和停车场入口两个观测点,车位(空间)、车(数据)

发送端:车辆先经过停车场入口,停车场会先显示车位-1(空间P操作 ),接下来车辆入库车辆+1(数据V操作)
接收端:车辆离开停车场先离开车位,所以是车辆先离开车位车辆-1(数据P操作),经过停车场出口驶离停车场时,停车场会显示车位+1(空间V操作)

1. 根据key值获取信号量ID – semget() — man 2 semget

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

   int semget(key_t key, int nsems, int semflg);

key: key值 nsems: 信号量元素的个数 semflg: IPC_CREAT | 0666

返回值: 成功:信号量ID号 失败:-1

2. P/V 操作 – semop() — man 2 semop

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

   int semop(int semid, struct sembuf *sops, unsigned nsops);

semid: 信号量的ID号 sops: 信号量进行P/V操作的结构体 nsops: 信号量操作结构体个数 :1

struct sembuf{
unsigned short sem_num; /* semaphore number / 操作的元素的下标 空间:0 数据:1
short sem_op; /
semaphore operation / P(-1) / V(1) ??
short sem_flg; /
operation flags */ 选项: 0 }

3. 设置信号量的属性 semctl – man 2 semctl

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

   int semctl(int semid, int semnum, int cmd, ...);

semid: 信号量ID号 semnum: 操作的成员的下标对象 空间: 0 数据: 1 cmd: 删除:
IPC_RMID 设置初始值: SETVAL …: 额外的参数 空间/数据起始值

例子: 设置空间的起始值:1  数据为:0
  semctl(shmid,0,SETVAL,1); 	semctl(shmid,1,SETVAL,0);

发送端:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>

int main()
{
   
	key_t key1,key2;
	int shmid
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值