Linux多进程通信(2)——POSIX信号量使用例程

1.POSIX信号量

1)POSIX信号量和System V信号量区别
常用的是POSIX信号量,使用起来更加方便,而POSIX信号量分为有名信号量和无名信号量

POSIX信号量是多线程多进程安全的,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。

POSIX无名信号量,非多进程共享时,相当于存放在进程的全局变量,进程结束则内存销毁,而若是有名信号量,则存在共享内存中,只要共享内存区存在,则信号灯就一直存在,这也是使用时经常发现sem_open调用失败的原因

POSIX信号量,用ls /dev/shm能看到,而System V信号量,则是使用ipcs -s查看。

2)无名信号量和有名信号量
有名信号量:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广
无名信号量:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量
image.png

2.信号量创建

1)有名信号量

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);

oflag:可取O_CREAT和O_EXCL,取O_CREAT时,表示要创建信号量,用O_CREAT时文件存在,就返回错误信息,一般会使用O_CREAT和O_EXCL一起,信号量不存在则创建,存在则报错
mode:读写权限,如0777
value:信号量初始值

2)无名信号量

#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);

sem:信号量指针
pshared:0,用于线程间(全局变量),非0用于进程间(共享内存)
value:信号量初始值

3.信号量销毁

1)有名信号量

#include <semaphore.h>
int sem_close(sem_t *sem); /// 信号量关闭
int sem_unlink(const char *name); ///信号量删除

信号量关闭并不等于删除。
进程会记录进程和信号的关系,调用sem_close时,会终止这种关联关系,信号量的进程数的引用计数减1,但即使通过调用sem_close将信号量计数到0,也不会删除
而调用sem_unlink时,若引用计数不为0,则需要当所有打开该信号量的进程,都将信号量关闭,才会真正进行删除操作

2)无名信号量

#include <semaphore.h>
int sem_destroy(sem_t *sem);

调用sem_destroy时,只有当所有进程都不再等待这个信号量时需要用户确保!),才能安全销毁。

4.等待信号量

#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

若信号量计数大于0,则成功拿到信号量,信号量计数-1,可以访问共享资源,若信号量计数小于等于0,则无法拿到信号量,执行的进程会放到PCB等待队列
sem_wait:阻塞等待信号量,拿到信号量再返回
sem_trywait:非阻塞尝试拿信号量,不阻塞。成功则返回0,失败返回EAGAIN
sem_timedwait:设定最大超时的阻塞式等待信号量,若不超时返回0,超过abs_timeout的等待时间,则返回-1, 并置errno为ETIMEOUT。

使用sem_timedwait的陷阱:

4.发布信号量

#include <semaphore.h>
int sem_post(sem_t *sem);

表示共享资源使用完毕,归还共享资源,使信号量计数+1
如果发布信号量之前, 信号量的值是0, 并且已经有进程或线程正等待在信号量上, 此时会有一个进程被唤醒, 被唤醒的进程会继续sem_wait函数的减1操作。如果有多个进程正等待在信号量上, 那么将无法确认哪个进程会被唤醒。如果发布信号量时,并没有进程在等待,则内核会维护这个计数,直到有人来取走信号量。
函数调用成功时, 返回0; 失败时, 返回-1, 并置errno。 当参数sem并不指向合法的信号量时, 置errno为EINVAL; 当信号量的值超过上限时, 置errno为EOVERFLOW

5.例程

1)server.c

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>#define SEM_NAME "sem_test"
int main(int argc, char **argv)
{int iRet = 0;int iSemCnt = 0;sem_t *pSem = sem_open(SEM_NAME, O_CREAT|O_EXCL, 0777, 1);if (!pSem){printf("server sem open failed\n");return -1;}sem_getvalue(pSem, &iSemCnt);printf("server begin for wait sem:%p, sem cnt:%d\n", pSem, iSemCnt);sem_wait(pSem);sem_getvalue(pSem, &iSemCnt);printf("server wait sem:%p success, sem cnt:%d\n", pSem, iSemCnt);sleep(5);sem_post(pSem);sem_getvalue(pSem, &iSemCnt);printf("server send sem:%p success, sem cnt:%d\n", pSem, iSemCnt);sleep(5);sem_close(pSem);sem_unlink(SEM_NAME);return 0;
}

2)client.c

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>#define SEM_NAME "sem_test"
int main(int argc, char **argv)
{int iRet = 0;int iSemCnt = 0;sem_t *pSem = sem_open(SEM_NAME, O_RDWR);if (!pSem){printf("server sem open failed\n");return -1;}sem_getvalue(pSem, &iSemCnt);printf("client begin for wait sem:%p, sem cnt:%d\n", pSem, iSemCnt);sem_wait(pSem);sem_getvalue(pSem, &iSemCnt);printf("client wait sem:%p success, sem cnt:%d\n", pSem, iSemCnt);sleep(5);sem_close(pSem);printf("client close sem: success\n", pSem);return 0;
}

其中server在open打开信号量后,设置计数为1,并进行wait操作,之后延时5S发送信号量,这个信号量成功被client给拿到,打印等待成功。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外包干了25天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Mysql中的 IFNULL 函数的详解

Mysql中的 IFNULL 函数的详解 概念 在mysql中IFNULL() 函数用于判断第一个表达式是否为 NULL&#xff0c;如果第一个值不为NULL就执行第一个值。第一个值为 NULL 则返回第二个参数的值。 语法 IFNULL(a, b)Demo 举例说明 创建表 create table student_one( sno varchar(20)…

机器学习: 绪论(基础概念)

文章目录 一、机器学习做什么二、机器学习的基本术语2.1、数据相关2.1.1、数据集2.1.2、特征&#xff08;Feature&#xff09;2.1.3、样本空间&#xff08;Sample Space&#xff09; 2.2、任务相关2.2.1、分类2.2.2、回归2.2.3、聚类2.2.4、监督学习和无监督学习 三、机器学习思…

智乃想考一道鸽巢原理

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

VSCode 设置vue2模板

点击设置 > 用户代码片段 > 输入Vue &#xff08;打开vue.json&#xff09;> 将代码复制内 "Print to console": {"prefix": "<","body": ["<template>"," <div class$1></div>"…

苹果App上架指南

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍&#xff1a;1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

【随笔】Git -- 高级命令(中篇)(七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

文本直接生成2分钟视频,即将开源模型StreamingT2V

Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间&#xff0c;动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美&#xff0c;但在高速运…

【项目技术介绍篇】若依项目代码文件结构介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

深入剖析Xen与KVM虚拟化技术及其架构特点

引言 在现代数据中心与云计算领域中&#xff0c;虚拟化技术已经成为提升资源利用率、增强灵活性与可扩展性的重要基石。其中&#xff0c;Xen与KVM作为两种备受瞩目的开源虚拟化解决方案&#xff0c;分别以其独特的设计理念与技术创新引领着行业的进步与发展。Xen源自剑桥大学的…

基于深度学习的停车场车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 上图测试结果如下图所示&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 image imread(image_test\test.jpg); image2 image;%图…

第21章-直连路由和静态路由

1. 直连路由 1&#xff09;定义&#xff1a;指路由器接口直接相连的网段的路由&#xff1b; 2&#xff09;特点&#xff1a; ① 不需要特别的配置&#xff0c;双UP(物理层数据链路层)&#xff1b; ② 在路由器的接口上配置IP地址即可&#xff1b; ③ 开机自动产生&#xff1b; …

Scala第十六章节(泛型方法, 类, 特质的用法、泛型上下界、协变, 逆变, 非变的用法以及Scala列表去重排序案例)

Scala第十六章节 章节目标 掌握泛型方法, 类, 特质的用法了解泛型上下界相关内容了解协变, 逆变, 非变的用法掌握列表去重排序案例 1. 泛型 泛型的意思是泛指某种具体的数据类型, 在Scala中, 泛型用[数据类型]表示. 在实际开发中, 泛型一般是结合数组或者集合来使用的, 除此…

vulhub中Apache solr XML 实体注入漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞&#xff1a;XML…

Day13Day14_学点儿HTML_基本标签、div和span、table、form

1 基本标签 HTML&#xff1a;超文本标记语言 定义页面结构 CSS&#xff1a; 层叠样式表 页面显示的样式、排版 BootStrap JS&#xff1a; JavaScript 界面交互(动态交互、逻辑) JQuery <!--~ 适度编码益脑&#xff0c;沉迷编码伤身&#xff0c;合理安排时…

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

摘要 https://arxiv.org/ftp/arxiv/papers/2311/2311.03747.pdf 计算机视觉在解决包括智能农业、渔业和畜牧业管理等不同领域的实际问题中变得越来越普遍。这些应用可能不需要每秒处理许多图像帧&#xff0c;因此从业者倾向于使用单板计算机&#xff08;SBCs&#xff09;。尽管…

基于SpringBoot的“校园志愿者管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园志愿者管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面图 志愿者注册…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值

【Web】记录Polar靶场<中等>难度题一遍过(全)

目录 到底给不给flag呢 写shell 注入 某函数的复仇 xxe SSTI unpickle BlackMagic 反序列化 找找shell 再来ping一波啊 wu 代码审计1 你的马呢&#xff1f; ezphp 随机值 phpurl search file PlayGame csdn 反正持续一个月&#xff0c;感觉XYCTF…