SystemV 信号量(一) —— SystemV信号量的相关操作函数(semget / semop /semctl)
SystemV IPC 方案的相关内容都是通过 “房间密码”来创建房间,获取到房间的ID,后面其他进程也可以根据这个房间密码来拿到同一个房间的ID。这是理解下面这些操作函数的关键。
目录
1、信号量集合的创建 semget
2、信号量的初始化 / 销毁 semctl
3、信号量的PV操作 semop
1、信号量集合的创建 semget
注意这里是信号量集合的创建,semget 可以一次创建多个信号量,为了管理这些信号量,统一把这些信号量放在一个信号量集合中,如果创建成功,返回的就是信号集的ID。
第一个参数 key:“房间密码”。通过ftok函数获取,。
第二个参数 nsem:信号量集合中信号量的个数。如果不打算创建 一个新的信号量集合的时候,该参数可以是0。
第三个参数 semflg:信号量集合的访问权限。通常是IPC_CREAT | 0666,如果信号量集合已经存在,那么信号量集合的访问权限会被修改成当前填入的权限。
返回值:成功返回信号量集合的ID,失败返回 -1
key_t key = ftok(".", 100);// 创建一个信号量集合,该信号集包含2个信号量,访问权限为 0666
semget(key, 2, IPC_CREAT | 0666);
2、信号量的初始化 / 销毁 semctl
semctl 可以对信号量集合中的信号量进行初始化或者删除。因为现在只有信号量集合的ID,实际上我们要想操作信号量集合中的某一个信号量,需要先给这些信号量编号,然后根据编号来定向操作某一个信号量。
第一个参数 semid:信号量集合的ID
第二个参数 semnum:要操作信号量集合中的信号量编号。信号量集合给信号量编号的方式类似于数组下标,是从0开始的,所以为了区分哪个信号量是干什么用的,可以使用宏或者 枚举的方式来指明。如果第三个参数是IPC_RMID,当前参数会被无视。
// 枚举的方式
// SEM_WR: 对应下标0
// SEM_RD: 对应下标1
enum SEM
{SEM_WR,SEM_RD
};// 宏定义的方式
#define SEM_WR 0
#define SEM_RD 1
第三个参数 cmd:要对信号量所作的操作。可选值如下:
可选值 | 含义 |
GETVAL | 获取第 semnum 个信号量的值,当前函数的返回值就是获得值。 |
SETVAL | 设置信号量的值,需要用到第四个参数联合体 |
IPC_RMID | 删除当前信号量集合。此时第二个参数semnu会被无视 |
第四个参数:根据不同的cmd,可能需要传递参数。比如,当cmd=SETVAL时,需要填入第四个参数来告知当前函数,你想要要设置的值。第四个参数是一个联合体,联合体的格式如下:
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) */
};
注意:使用该联合体的时候,需要自己手动声明。
返回值:失败返回 -1;成功时会根据cmd的值返回不同的值(值是大于0的)
3、信号量的PV操作 semop
semop包含了对信号量集合中信号量的 P操作(申请) 和 V操作(释放)。
第一个参数 semid:信号量集合的ID
第二个参数 sops:输入型参数,要对信号量集合中的哪个信号量做什么操作,阻塞方式又是怎样。结构体sembuf 的声明如下:
struct sembuf {unsigned short sem_num; // 要操作的信号量的编号short sem_op; // 对信号量进行的操作// 1: 释放资源,V操作// -1: 申请资源,P操作short sem_flg; // 阻塞方式。0表示阻塞,IPC_NOWAIT表示非阻塞
};
注意:如果要一次操作多个信号量,那么就需要定义一个sembuf类型的结构体数组
第三个参数 nsops:要操作的信号量的个数。一般是 1
返回值:成功返回 0,失败返回 -1。
SystemV 信号量(一) —— SystemV信号量的相关操作函数(semget / semop /semctl)相关推荐
- 信号量函数 semget() semop() semctl()
semget() 可以使用系统调用semget() 创建一个新的信号量集,或者存取一个已经存在的信号量集 : 系统调用:semget(); 原型:intsemget(key_t key,in ...
- skb结构和相关操作函数
skb是linux kernel中收发数据包用到的控制结构体,有些字段指向分配的内存用于存放数据包, 向协议栈传送时,通过移动指针来获取到以太头,网络头,传输头等信息. skb结构和相关操作函数 a. ...
- uCOS-II消息邮箱的相关操作函数
定位到uCOS-II/Source/os_mbox.c,该文件是消息邮箱管理的相关操作函数. 任务与任务之间需要数据传递,那么为了适应传递的数据的不同类型,可以建立一个缓冲区(void*类型可以接 ...
- 封装进程内存相关操作函数
//ProcessMemory.h:进程内存操作封装 #pragma once #include <windows.h> #include <TLHELP32.H>class ...
- linux skb 结构和相关操作函数分析
sk_buff是Linux网络中最核心的结构体,它用来管理和控制接收或发送数据包的信息.各层协议都依赖于sk_buff而存在.内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体 ...
- linux kernel --- dts的相关操作函数
一.compatible匹配 1.dts 中写法 compatible = "aaa,bbb" 当一个驱动支持多个设备的时候,在每个设备的dts中,都会配置各自的compatibl ...
- c语言 信号函数,C语言中进程信号集的相关操作函数详解
C语言sigismember()函数:测试某个信号是否已加入至信号头文件:#include 定义函数:int sigismember(const sigset_t *set, int signum); ...
- c语言实现新建目录函数,C语言中改变目录的相关操作函数详解
C语言fchdir()函数:改变当前工作目录头文件: #include 定义函数: int fchdir(int fd); 函数说明:fchdir()用来将当前的工作目录改变成以参数fd 所指的文件描 ...
- linux文件信号量删除,linux信号量_閑の洎茬
1.1 创建信号量 int semget( key_t key, //标识信号量的关键字,有三种方法:1.使用IPC--PRIVATE让系统产生, // 2.挑选一个随机数,3.使用ftok从文件 ...
最新文章
- 计算机vb2级知识点,二级考试(VB)知识点细化(针对浙江省计算机等级考试)
- python约束 与MD5加密写法
- 【python自动化办公04】word操作-word文字颜色修改
- 实验7.2 二维数组 7-6 方阵循环右移
- Facebook、阿里等大佬现身说法,NLP是否被高估了?
- 13日直播预告丨Oracle多套库整合到多租户平台案例分享
- html中怎么不让网页缩放_网页中的形状图形都是怎么画出来的?
- Google 发布全中文机器学习速成课,曾内部培训过 1.8 万人!
- 网站克隆:setoolkit社工软件
- queryDSL复杂查询的分页和自定义排序实现
- Activiti6驳回上一节点
- 使用Python查看并显示图像
- java zh_java 中zhis的用法
- ios保存gif到相册_iOS如何保存下载GIF图片
- 数学表达式基础——1 基本符号与术语
- 网络栈主要结构介绍(socket、sock、sk_buff,etc)
- 成功在于实践作文_人生贵在实践作文800字
- 对话推荐系统CRS论文精读RevCore: Review-augmented Conversational Recommendation
- 玉米社:什么是差异化营销,差异化营销案例有哪些?
- 智慧环保三维可视化决策系统平台(数字孪生)-解决方案开发案例
热门文章
- 【算法设计zxd】第3章 求解方程的近似算法 非线性——二分法(穿根),牛顿法(切线),线性代数
- Google Earth Engine(GEE)——以MODIS/006/MCD19A2为例批量下载逐天AOD数据逐天的均值、最大值、最小值、标准差、方差统计分析和CSV下载(北京市各区为例)
- 《会计学》企业基本经济业务核算(企业实收资本)思维导图
- 语义鸿沟、异构鸿沟、数据缺失,多模态技术如何跨过这些坎?
- python实现图像傅里叶变换
- Java项目:springboot景区旅游管理系统
- C++服务编译耗时优化原理及实践
- java Charset(字符集)类的操作
- 《捕鱼达人 3》主程洪志雄专访:如何使用Cocos2d-x完美呈现捕鱼3
- 这 6 款在线 PDF 转换工具,得试