linux进程间信号量通信IPC(sem)

2023-09-21 14:20:59

一、信号量

信号量是一种用于提供不同进程间或一个从给定进程的不同线程间同步手段的原语。
在这里插入图片描述

1.1、Posix信号量的选择

1)单个进程的各个线程共享,可以使用基于内存的信号量。

2)彼此无亲缘关系的不同进程需使用信号量时,通常使用有名信号量。

1.2、基于内存的信号量的持续性

1)如果某个基于内存的信号量是由单个进程的各个线程共享的(sem_init的shared的参数为0),那么该信号量具有随进程的持续性,当该进程终止时它也消失。

2)如果某个基于内存的信号量是在不同进程间共享的(sem_init的shared的参数为1),那么该信号量必须存放在共享内存区中,因而只要该共享内存区任然存在,该信号量也就继续存在。

二、信号量分类

在这里插入图片描述

三、特性

1)互斥锁必须总是由锁住它的线程解锁,信号量的挂出却不必由执行过它的等待操作的同一线程执行。

2)信号量有一个与之关联的状态(计数值),信号量的挂出操作总是被记住。向一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么该信号将丢失(即如果某个线程调用pthread_cond_signal,不过当时没有任何线程阻塞在pthread_cond_wait调用中,那么发往相应条件变量的信号将丢失)。

3)当持有某个信号量锁的进程没有释放该锁就终止时,内核没有自动挂出该信号量。这与记录锁不一样,当持有某个记录锁的进程没有释放它就终止时,内核会自动释放。

四、Posix信号量函数

sem_open()函数    //创建一个新的有名信号量或打开一个已存在的有名信号量。

sem_close()函数
关闭由sem_open()打开的有名信号量。

sem_unlink()函数
从系统中删除有名信号量。

sem_wait()函数
等待信号量,如果该值大于0,那就将它减1并立即返回。如果该值等于0,调用线程就被投入睡眠,知道该值变为大于0,此时再将它减1,函数随后返回。

sem_trywait()函数
当所指定信号量为0时,不将调用线程投入睡眠。而是返回一个EAGAIN错误。

sem_post()函数
把所指定的信号量加1,然后唤醒正在等待该信号量变为正数的任意线程。

int sem_getvalue(sem_t *sem, int *sval);
参数 sem:等待的信号量。
参数 savl:保存所指定信号量的当前值。如果该信号量当前已上锁,那么返回或为0, 或为某个负数(其决定值就是等待该信号量解锁的线程数)

sem_init()函数
基于内存的信号量初始化。

sem_destroy()函数
摧毁基于内存的信号量。

五、System V信号量

在这里插入图片描述

函数说明

smeget()函数
创建一个信号量集或访问一个已存在的信号量集。

semop()函数
对信号量进行操作。
更多推荐

MySQL正则表达式:模式匹配、中文匹配、替换、提取字符串

在MySQL中,使用REGEXP或RLIKE操作符进行正则表达式匹配,而使用NOTREGEXP或NOTRLIKE操作符进行不匹配。一些常用的MySQL正则表达式语法:匹配字符:.:匹配任意字符(除了换行符)。[]:匹配方括号中的任意字符。[^]:匹配不在方括号中的任意字符。匹配重复:*:匹配零个或多个前面的字符。+:匹

【C++从0到王者】第三十一站:map与set

文章目录一、关联式容器二、pair键值对三、set1.set的介绍2.set的部分接口以及应用3.count4.lower_bound和upper_bound5.equal_range6.multiset容器四、map1.map的介绍2.map的一些常见接口以及使用3.map的[]运算符重载4.使用map改进一些题5.

代理IP和Socks5代理:跨界电商与爬虫的智能引擎

跨界电商,作为全球市场的一部分,对数据的需求越来越大。同时,随着互联网的发展,爬虫技术也在不断演进,成为了跨界电商的关键工具之一。然而,随之而来的是网站的反爬虫机制和网络安全风险。在这种情况下,代理IP和Socks5代理应运而生,为企业提供了数据采集的解决方案和网络安全的保护。本文将深入研究代理IP和Socks5代理在

应用平台 - OPPO敏感权限

那天在OPPO平台更新app时,发现平台权限升级,新增了敏感权限校验,而且还是必填项…Google从Android6.0开始就对权限做了分类适配,粗浅来看将权限分为了普通权限、危险权限(运行时权限、敏感权限),如果需要用到危险权限除了需要在AndroidManifest(清单文件)注册之外,我们还需要进行申请动态权限有

【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述基于遗传算法的最优配电变电站放置为了实现配电变电站

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式传输给服务端,而服务端接受客户端传过来的二进制文件流以及文件名称等信息(此时这些二进制文件流存储在内存中),然后将其写入存储

物联网网络安全:保护物理世界和数字世界的融合

我们正在见证数字技术如何成为我们日常生活和经济系统的一部分,从而提高福利并增强竞争力。尽管如此,新的尖端互联技术的迅速出现和采用也对政府、企业和整个社会构成了重大威胁。长期以来,网络安全威胁一直是电影行业的一个现成的灵感来源,它设想了一些令人担忧的场景,在这些场景中,滥用技术和数据会危及社会、企业和政府。然而,被描绘成

角度回归——角度编码方式

文章目录1.为什么研究角度的编码方式?1.1角度本身具有周期性1.2深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定1.3那么如何处理边界问题呢:(以θ的边界问题为例)1.3顺时针(CW)1.4逆时针(CCW)2角度回归的方式2.1长边定义法,强制W<H,range范围[-9

如何更好的选择服务器硬盘?

一.选择服务器硬盘时,可以考虑以下几个因素:1.容量需求:首先确定您的服务器对存储容量的需求。评估您预计需要存储的数据量、应用程序和文件的大小,以及未来的扩展需求。确保选择的硬盘能够满足服务器的存储需求,并有足够的空间用于备份和增长。2.性能要求:考虑您的服务器对性能的需求。如果服务器需要处理大量的读写操作、高速数据传

解决@vueup/vue-quill图片上传、视频上传问题

Editor.vue<template><el-upload:action="uploadUrl":before-upload="handleBeforeUpload":on-success="handleUploadSuccess"name="files":on-error="handleUploadError":s

第一章 计算机网络基础

目录1.1网络体系结构1.1.1OSI/RM七层参考模型1.1.2OSI/RM和TCP/IP模型的比较1.1.3五层协议的体系结构1.1.4计算机1向计算机2发送数据过程1.1.5TCP/IP体系结构的具体实现1.2网络设备概述1.2.1互联设备与OSI的对应关系1.2.2集线器(HUB)1.2.3网桥(Bridge)

热文推荐