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)相关推荐

  1. 信号量函数 semget() semop() semctl()

    semget()      可以使用系统调用semget() 创建一个新的信号量集,或者存取一个已经存在的信号量集 : 系统调用:semget(); 原型:intsemget(key_t key,in ...

  2. skb结构和相关操作函数

    skb是linux kernel中收发数据包用到的控制结构体,有些字段指向分配的内存用于存放数据包, 向协议栈传送时,通过移动指针来获取到以太头,网络头,传输头等信息. skb结构和相关操作函数 a. ...

  3. uCOS-II消息邮箱的相关操作函数

    定位到uCOS-II/Source/os_mbox.c,该文件是消息邮箱管理的相关操作函数.   任务与任务之间需要数据传递,那么为了适应传递的数据的不同类型,可以建立一个缓冲区(void*类型可以接 ...

  4. 封装进程内存相关操作函数

    //ProcessMemory.h:进程内存操作封装 #pragma once #include <windows.h> #include <TLHELP32.H>class ...

  5. linux skb 结构和相关操作函数分析

    sk_buff是Linux网络中最核心的结构体,它用来管理和控制接收或发送数据包的信息.各层协议都依赖于sk_buff而存在.内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体 ...

  6. linux kernel --- dts的相关操作函数

    一.compatible匹配 1.dts 中写法 compatible = "aaa,bbb" 当一个驱动支持多个设备的时候,在每个设备的dts中,都会配置各自的compatibl ...

  7. c语言 信号函数,C语言中进程信号集的相关操作函数详解

    C语言sigismember()函数:测试某个信号是否已加入至信号头文件:#include 定义函数:int sigismember(const sigset_t *set, int signum); ...

  8. c语言实现新建目录函数,C语言中改变目录的相关操作函数详解

    C语言fchdir()函数:改变当前工作目录头文件: #include 定义函数: int fchdir(int fd); 函数说明:fchdir()用来将当前的工作目录改变成以参数fd 所指的文件描 ...

  9. linux文件信号量删除,linux信号量_閑の洎茬

    1.1 创建信号量 int semget( key_t key,   //标识信号量的关键字,有三种方法:1.使用IPC--PRIVATE让系统产生, // 2.挑选一个随机数,3.使用ftok从文件 ...

最新文章

  1. 计算机vb2级知识点,二级考试(VB)知识点细化(针对浙江省计算机等级考试)
  2. python约束 与MD5加密写法
  3. 【python自动化办公04】word操作-word文字颜色修改
  4. 实验7.2 二维数组 7-6 方阵循环右移
  5. Facebook、阿里等大佬现身说法,NLP是否被高估了?
  6. 13日直播预告丨Oracle多套库整合到多租户平台案例分享
  7. html中怎么不让网页缩放_网页中的形状图形都是怎么画出来的?
  8. Google 发布全中文机器学习速成课,曾内部培训过 1.8 万人!
  9. 网站克隆:setoolkit社工软件
  10. queryDSL复杂查询的分页和自定义排序实现
  11. Activiti6驳回上一节点
  12. 使用Python查看并显示图像
  13. java zh_java 中zhis的用法
  14. ios保存gif到相册_iOS如何保存下载GIF图片
  15. 数学表达式基础——1 基本符号与术语
  16. 网络栈主要结构介绍(socket、sock、sk_buff,etc)
  17. 成功在于实践作文_人生贵在实践作文800字
  18. 对话推荐系统CRS论文精读RevCore: Review-augmented Conversational Recommendation
  19. 玉米社:什么是差异化营销,差异化营销案例有哪些?
  20. 智慧环保三维可视化决策系统平台(数字孪生)-解决方案开发案例

热门文章

  1. 【算法设计zxd】第3章 求解方程的近似算法 非线性——二分法(穿根),牛顿法(切线),线性代数
  2. Google Earth Engine(GEE)——以MODIS/006/MCD19A2为例批量下载逐天AOD数据逐天的均值、最大值、最小值、标准差、方差统计分析和CSV下载(北京市各区为例)
  3. 《会计学》企业基本经济业务核算(企业实收资本)思维导图
  4. 语义鸿沟、异构鸿沟、数据缺失,多模态技术如何跨过这些坎?
  5. python实现图像傅里叶变换
  6. Java项目:springboot景区旅游管理系统
  7. C++服务编译耗时优化原理及实践
  8. java Charset(字符集)类的操作
  9. 《捕鱼达人 3》主程洪志雄专访:如何使用Cocos2d-x完美呈现捕鱼3
  10. 这 6 款在线 PDF 转换工具,得试