C语言-进程——信号量

2023-05-16

system-V的信号量其实是一个信号量数据,一个sysyem-V代表的是一个或多个信号量元素

信号量本质上是一个数字,用来表征一种资源数量,当多个进程或线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源。

信号量SEM,不是用来传输数据的,而是作为“旗语”,用来协调个进程或者而线程工作的。

1信号量分类

  1. ststem-V信号量
  2. POSIX有名信号量
  3. POSIX无名信号量

2一些基本概念

  1. 临界资源:也叫共享资源,多个进程或线程有可能同时访问的资源(变量、链表、文件等等)
  2. 临界区:访问这些资源的代码成为临界代码,这些代码区域区域称为临界区
  3. P操作:程序进入临界区之前之前必须要对资源进行申请,这个动作被称为P操作,简单来说就是申请资源
  4. V操作:程序离开临界区之后必须要释放响应的资源,这个动作被称为V操作,简单来说就是释放资源

3核心API

相同的头文件

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

3.1创建SEM

功能:获取信号量ID

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

参数:

  • 返回值:
    • 成功:信号量ID
    • 失败:-1
  • key:信号量的键值
  • nsems:信号量元素的个数
  • semflg:创建选项
    • IPC_CREAT:如果key对应的信号量不存在,则创建
    • IPC_EXCL:如果key对应的信号量存在,则报错
    • mode:信号量的访问权限

创建信号量时,还受到一下系统信息的影响

  1. SEMMNI:系统中信号量的总数最大值
  2. SEMMSL:每个信号量中信号量元素的个数最大值
  3. SEMMNS:系统中素有信号量中的信号量元素的总数最大值

实例代码:

int main(void) 
{ 
    key_t key = ftok(".",1); 
    int semid = semget(key,2,IPC_CREATE|0666); 
}

3.2PV操作

功能:对信号量进行PV操作,或者等零操作

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

参数:

  • 返回值:
    • 成功:0
    • 失败:-1
  • semid:信号量ID
  • sops:信号量操作结构体数组
  • nsops结果体数组元素个数
  1. 信号量操作结构体
struct sembuf { 
    unsigned short sem_num;//信号量元素序号     
    short sem_op;//操作参数 
    short sem_flg;//操作选项 
}
  1. 根据sem_op的值,信号量操作分为3中情况:
    1. sem_op>0:V操作
    2. sem_op=0:等零操作
    3. sem_op

示例代码

int main() { 
    key_t key = ftok(".", 1); // 创建(若已有则打开)一个包含2个元素的信号量组 
    int id = semget(key, 2, IPC_CREAT|0666); // 定义包含两个P/V操作的结构体数组 
    struct sembuf op[2]; 
    op[0].sem_num = 0; // 信号量元素序号 
    op[0].sem_op = -2; // P操作 
    op[0].sem_num = 0; // 选项默认0 
    op[1].sem_num = 1; // 信号量元素序号 
    op[1].sem_op = +3; // V操作 
    op[1].sem_num = 0; // 选项默认0 
    // 同时对第0、1号信号量元素分别进行P、V操作 
    semop(id, op, 2);
}

3.3 获取或设置信号量的相关属性

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

参数:

  • semid:信号量ID
  • semnum:信号量元素序号
  • cmd
    • IPC_STAT:获取属性信息
    • IPC_SET:设置属性信息
    • IPC_RMID:立即删除该信号量,参数semnum将被忽略
    • IPC_INFO:获得关于信号量的系统限制信息
    • SEM_INFO:获得系统为共享内存消耗的资源信息
    • SEM_STAT:获得系统中所有SEM的相关信息
    • GETALL:返回所有信号量元素的值,参数semnum将被忽略
    • GETNCNT:返回正阻塞在对该吸纳后量元素P操作的进程总数
    • GETPID:返回最后一个队该信号量元素操作的进程PID
    • GETVAL:返回该信号量元素的值
    • GETZCNT:返回正阻塞对该信号量元素等零操作的进程总数
    • SETALL:返回所有信号量元素的值,参数semnum将被忽略
    • SETVAL:设置该信号量元素的值
  • 返回值
    • GETNCNT:semncnt
    • GETPID:sempid
    • GETVAL:semval
    • GETZCNT:semzcnt
    • IPC_INFO:内核中记录所有SEM信息的数组的下标最大值
    • SEM_INFO:同IPC_INFO
    • SEM_STAT:内核中看i路所有SEM信息的数组
    • 失败:-1
  1. 这是一个变参函数,根据cmd的不同,可能需要第四个参数,第四个参数是一个如下所示的联合体,用户需要自己定义
union semun { 
    int val;//当cmd为SERVAL时使用 
    struct semid_ds *buf;//当cmd为IPC_STAT或IPC_SET时使用 
    unsigned short *array;//当cmd为GETALL或SETALL时使用 
    struct seminfo *_buf;//当cmd为IPC_INFO时使用 
}
  1. 当cmd为IPC_STAT或IPC_SET时,需要用到一下属性信息结构体
struct semid_ds { 
    struct ipc_perm sem_perm;//权限相关信息 
    time_t sem_otime;//最后一次semop()的信息 
    tien_t sem_ctime;//最后一次状态改变时间 
    unsigned short sem_nsems;//信号量元素个数 
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言-进程——信号量 的相关文章

随机推荐

  • 【Linux命令-shell】字符串的处理与变量的初始化

    目录 1 字符串的处理机制 1 1字串的截取 1 2字串的替换 1 3字串的掐头 1 4字串的去尾 1 5批量修改文件的扩展名 2 变量初始化 2 1创建系统用户 1 字符串的处理机制 1 1字串的截取 语法格式 xff1a 变量 xff1
  • STC89C51 单片机60s倒计时

    基于51单片机实现60s倒计时 八段数码管动态驱动I O口显示 数码管动态显示界面 xff0c 动态驱动数码管8个笔画 a b c d e f g dp 小数点 xff0c 同名端连在一起 xff0c 并为每个数码管的公共极COM增加位选控
  • 设有4x4的方阵,其中的元素由键盘输入。分别求出主对角线上元素之和、辅对角线上元素之积、方阵中最大的元素。

    知识点 xff1a 理解二维数组与主 辅对角线 在上述求主对角线和辅对角线的和已给出如何找到在主对角线上及辅对角线上的元素 那么在这里便不再赘述相同的概念了 xff0c 若仍有疑问的同学可通过链接分别计算二维数组主对角线元素与辅对角线元素的
  • win11电脑开移动热点,但是手机连不上

    一 现象描述 电脑连接宽带 xff0c 然后用电脑开移动热点 前一天用手机连接热点的时候 xff0c 还是正常的 xff1b 今天连接的时候 xff0c 手机就显示 拒绝接入 寻找各种解决方法 xff0c 结果都无法解决我的问题 后来 xf
  • Android:使用RxJAva实现倒计时

    64 SuppressLint 34 SetTextI18n 34 private void startTimer mTvSend setEnabled false Observable intervalRange 1 60 0 1 Tim
  • linux的远程管理

    linux的远程管理 一 远程管理二 实现ssh远程管理无密码验证 一 远程管理 span class token comment 我们需要安装openssh软件包 span span class token punctuation spa
  • Uni-app 小程序 App 的广告变现之路:激励视频广告

    Intro 激励视频广告 xff0c 是cpm收益最高的广告形式 手机用户观看几十秒视频广告 xff0c 在广告播放完毕后可获得应用开发商提供的奖励 xff0c 而应用开发商则可以从广告平台获取不菲的广告收入 与开屏 信息流等广告变现方式不
  • 数据库查询50道题

    创建四张表 student sc course teacher CREATE DATABASE db 2 CHARSET 61 39 utf8 39 USE db 2 Student Sid Sname Sage Ssex 学生表 DROP
  • 如何使用Python实现图像文字识别OCR

    要使用Python实现图像文字识别OCR xff0c 可以使用以下步骤 xff1a 安装Tesseract OCR引擎 Tesseract是一种开源OCR引擎 xff0c 可以处理多种语言和字体 要使用Python进行OCR xff0c 需
  • C#获取指定日期所在周、月、年的第一天和最后一天

    需求 xff1a 给定一个日期 xff0c 获取日期所在周的周一 周日 xff0c 获取日期所在月的第一天和最后一天 xff0c 获取所在年份的第一天和最后一天 代码如下所示 span class token comment lt summ
  • STM32+W5500网络通信

    目录 一 W5500介绍二 资源分享三 例子程序四 实现应用层modbus httpd协议编程 xff08 一 xff09 modbus xff08 二 xff09 HTTPS 五 总结六 参考链接七 modbus和HTTPS源码 一 W5
  • 服务器部署code-server

    部署code service 思路 1 租用服务器 2 部署code service 3 映射端口 xff0c 修改配置文件 4 让服务一直挂在后台 5 配置C C 43 43 环境 购买服务器 xff0c 部署宝塔面板 这里采用腾讯的云服
  • Arch 中 fcitx5 提示拼音不可用的解决过程

    Arch 中 fcitx5 提示拼音不可用的解决过程 问题描述 xff1a 按照 Fcitx5 ArchWiKi 安装 fcitx5 后不能输入中文 xff0c 提示拼音不可用 查找解决办法 首先查看环境变量设置是否正确 xff1a etc
  • Vue3 setup函数的使用

    全新的 setup 函数 在开始编写 Vue 组件之前 xff0c 需要了解两个全新的前置知识点 xff1a 全新的 setup 函数 xff0c 关系到组件的生命周期和渲染等问题 写 TypeScript 组件离不开的 defineCom
  • Stm32的按键控制流水灯

    对于stm32的设置首先是对时钟进行启动 要求 xff1a key0控制LED0和LED1的亮 key1控制LED0和LED1的亮 kw up控制闪灯 led c span class token macro property span c
  • 头文件之间存在依赖关系该如何包含?

    本文旨在探讨头文件之间存在依赖关系时 xff0c 包含顺序的影响 分两种情况讨论 xff1a 头文件A单方面依赖头文件B xff1a struct h xff1a struct abc int num char ptr def h xff1
  • 单片机入门(利用中断控制流水灯的走向)--适合初学者

    电路图 点击下载 xff08 下载时可能会提醒不安全 xff0c 其实没事 xff0c 本博主是放在自己服务器上面 xff09 代码 span class token macro property span class token dire
  • python实现微信公众号定时消息提醒-手把手教你将代码部署到云端

    这两天微信公众号消息提醒蛮火的 xff0c 我也来蹭一下热度 xff0c 我们的主题是考研倒计时 xff0c 顺便也发一发天气预报 思路 xff1a 获取我们需要的数据 xff0c 比如天气信息 然后去微信公众平台注册一个测试号 xff0c
  • 【章节自测】第三章——顺序程序设计

    第三章 顺序程序设计 学校的老师在上程序设计这门课时 xff0c 给我们每一章指定了一些学习目标 xff0c 用于课前的预习和课后的具体检测复盘 xff0c 因为每一个目标都是具体可测的 xff0c 而只要所有的目标你都能达成 xff0c
  • C语言-进程——信号量

    system V的信号量其实是一个信号量数据 xff0c 一个sysyem V代表的是一个或多个信号量元素 信号量本质上是一个数字 xff0c 用来表征一种资源数量 xff0c 当多个进程或线程争夺这些稀缺资源的时候 xff0c 信号量用来