多进程编程- POSIX命名信号量(named semaphore)

POSIX命名信号量是POSIX标准下的一个进程间同步原语,允许多个进程共享同一个信号量,从而实现进程间的同步和通信。这与无名信号量不同,无名信号量主要用于线程之间的同步,而不是进程之间。

命名信号量是“命名”的,因为它们使用特定的名称,这使得不同的进程可以打开并使用相同的信号量。

以下是关于POSIX命名信号量的一些关键点和功能:

  1. 创建/打开: 使用sem_open函数来创建或打开一个已存在的命名信号量。

  2. 关闭: 使用sem_close来关闭一个信号量的引用。这并不会删除该信号量,只是关闭当前进程对其的引用。

  3. 删除: 使用sem_unlink来删除一个命名信号量。它会将信号量标记为删除状态,并在所有进程都关闭了对它的引用后真正删除它。

  4. 增加: sem_post可以用于增加信号量的值。

  5. 减少: sem_waitsem_trywait可以用于减少信号量的值。如果信号量的值为0,sem_wait会阻塞,而sem_trywait会立即返回一个错误。

  6. 查询: 使用sem_getvalue可以查询信号量的当前值。

  7. 持久性: 命名信号量在系统中是持久的,即使没有进程引用它,它仍然存在,直到使用sem_unlink显式删除。

  8. 位置: 命名信号量通常在/dev/shm/run/shm中作为一个文件出现(取决于系统),尽管它们不是真正的文件,但这为诊断和调试提供了便利。

使用场景:

POSIX命名信号量在需要进程间同步或通信的场景中很有用,例如:

  • 一个进程生成数据,而另一个进程消费这些数据。信号量可以用来同步这两个进程,确保数据在被消费之前已经被生成。
  • 限制对共享资源的并发访问,例如一个配置文件或共享数据库。

使用POSIX命名信号量时,应注意避免死锁,并确保在所有情况下都正确地释放已获取的信号量。

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#define SEM_NAME "namedsem"  // Defines the name of the semaphoreint main()
{sem_t *p_sem = NULL;// Create a semaphorep_sem = sem_open(SEM_NAME, O_CREAT|O_EXCL, 0666, 0);sem_wait(p_sem);        // Wait the sempahoresem_unlink(SEM_NAME);   // Delete the semaphorereturn 0;
}

在这里插入图片描述

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#define SEM_NAME "namedsem"int main() {sem_t *p_sem = NULL;p_sem = sem_open(SEM_NAME, O_RDWR); // Open the semaphoresem_post(p_sem);                    // Release semaphorereturn 0;
}

在这里插入图片描述

以上两个程序,它们分别展示了如何使用POSIX命名信号量(named semaphore)。

  1. 第一个程序: 创建并等待信号量

    • 定义了一个命名信号量的名称namedsem
    • 使用sem_open函数,结合O_CREAT|O_EXCL标志,尝试创建并打开一个新的命名信号量。如果该信号量已经存在,调用会失败。
    • 设置的信号量初始值为0,这意味着信号量在创建后不可用。
    • 然后,程序调用sem_wait,尝试获取这个信号量。因为信号量的初始值为0,所以该调用会阻塞,直到有其他进程或线程使用sem_post释放信号量。
    • 最后,它调用sem_unlink来删除命名信号量。但请注意,只有在所有进程都关闭了该信号量的引用后,信号量才会被真正删除。
  2. 第二个程序: 打开并释放信号量

    • 使用相同的命名信号量名称namedsem
    • 使用sem_open函数,结合O_RDWR标志,尝试打开一个已存在的命名信号量。这里不再创建新的信号量,而是打开一个现有的信号量。
    • 然后,调用sem_post来释放这个信号量。这实际上会增加信号量的计数值。如果第一个程序在sem_wait中等待,它现在可以获取信号量并继续执行。

结论:
这两个程序组合起来演示了进程间同步的一个简单场景。第一个程序创建并等待一个信号量,而第二个程序打开这个信号量并释放它,从而允许第一个程序继续执行。这是进程间通信和同步的一个简单但非常有用的例子,它展示了如何使用命名信号量进行协作。

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

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

相关文章

工作、生活常用免费api接口大全

手机号码归属地&#xff1a;提供三大运营商的手机号码归属地查询。全国快递物流查询&#xff1a;1.提供包括申通、顺丰、圆通、韵达、中通、汇通等600快递公司在内的快递物流单号查询。2.与官网实时同步更新。3.自动识别快递公司。IP归属地-IPv4区县级&#xff1a;根据IP地址查…

Kubernetes集群+Keepalived+Nginx+防火墙 实例

目录 实验前期规划 1.拓扑图结构 2.实验要求 3.实验环境规划 一.kubeadm 部署 K8S 集群架构 1.环境准备 2.三个节点安装docker 3.三个节点安装kubeadm&#xff0c;kubelet和kubectl 4.部署K8S集群 &#xff08;1&#xff09;初始化 4.部署K8S集群 &#xff08;1&am…

Linux硬链接、软链接

硬链接是一个目录条目(在基于目录的文件系统中)&#xff0c;它将一个名称与一个文件关联起来。因此&#xff0c;每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(alias eff…

java微服务 Dubbo面试题/SpringCloud面试题

java微服务面试题 Q:为什么要用微服务&#xff1f;微服务有哪些优势&#xff1f; 单体应用把所有功能都堆放在一起&#xff0c;改动影响大&#xff0c;风险高。 微服务具有以下优势&#xff1a; 针对特定服务发布&#xff0c;影响小&#xff0c;风险小&#xff0c;成本低。 频…

C++:C++哪些时候用到const

声明常量&#xff1a;使用const关键字定义一个常量&#xff0c;不允许对其进行更改。例如&#xff1a; const int PI 3.1415926;修饰函数参数&#xff1a;加上const限定符可以确保函数不会修改传入的参数值。例如&#xff1a; void print(const int num) {// num不能在函数内…

【C++】异常处理(一)

这篇文章介绍下 C 的异常处理。 讨论一种最为常见的出现异常的情况&#xff0c;即 0 不能作为除数。为此&#xff0c;我们将自定义一个除法&#xff1a; #include <iostream>using namespace std;int divide(int a, int b) {return a / b; }int main() {int a 3, b 0…

【一、虚拟机vmware安装】

安装虚拟机 下载 官方下载地址&#xff1a;https://www.vmware.com/cn.html 大概流程就是&#xff0c;最重要的事最后一步

【openwrt学习笔记】miniupnpd学习笔记

目录 一、参考资料二、upnp基本概念三、miniupnpd3.1参数说明3.1.1 config upnp 的配置参数表3.1.2 config perm_rule 许可设置配置参数表 3.2 windows上使用miniupnpc工具3.3 关于开启upnp功能后无法添加端口 四、其它知识补充4.1 NAT4.1.1 NAT概念4.1.2 NAT的分类 4.2 NAT穿透…

Linux下git安装及使用

Linux下Git使用 1. git的安装 sudo apt install git安装完&#xff0c;使用git --version查看git版本 2. 配置git git config --global user.name "Your Name“ ##配置用户 git config --global user.email emailexample.com ##配置邮箱git config --global --list …

深入理解C#中委托的使用及不同类型委托的应用示例

在C#中&#xff0c;委托是一种强大而灵活的机制&#xff0c;可以引用一个或多个方法&#xff0c;并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用&#xff0c;并介绍不同类型委托的应用示例。 目录…

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码

众所周知&#xff0c;航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程&#xff0c;因此可利用虚拟仿真技术经济、安全及可重复性等特点&#xff0c;进行飞行任务或操作的模拟&#xff0c;以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合&#xf…

【吴恩达老师《机器学习》】课后习题5之【偏差与方差】

在本练习中&#xff0c;您将实现正则化线性回归&#xff0c;并使用它来研究具有不同偏差-方差特性的模型。 在练习的前半部分&#xff0c;您将实现正则化线性回归&#xff0c;利用水库水位的变化来预测从大坝流出的水量。在后半部分中&#xff0c;您将对调试学习算法进行一些诊…

[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?

How to Better Utilize Code Graphs in Semantic Code Search? [ESEC/FSE 2022] 语义代码搜索极大地促进了软件的重用&#xff0c;使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)丰富的表达能力&#xff0c;两种主流的研究工…

Flutter图标

https://fluttericon.cn/ Flutter 内置了丰富的图标。 Icon(Icons.ac_unit)

手机域名是什么?

随着移动互联网的迅猛发展&#xff0c;手机已经成为人们生活中不可或缺的一部分。无论是社交娱乐、在线购物还是工作沟通&#xff0c;手机都扮演着重要的角色。而在手机的世界中&#xff0c;域名作为连接用户和互联网的重要纽带&#xff0c;起着至关重要的作用。手机域名不仅简…

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站 CDN 内容分发网络&#xff1f; 当用户直接访问源站中的静态内容时&#xff0c;可能面临的体验问题&#xff1a; 客户离服务器越远&#xff0c;访问速度越慢。客户数量越多&#xff0c;网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…

idea中maven项目打包成jar,报错没有主清单属性解决方法

使用idea自带的打包可能会出现一下问题 在pom.xml中引入下面的依赖&#xff0c;即可解决 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions&…

MySQL数据库的存储引擎

目录 一、存储引擎概念 二、存储引擎 2.1MyISAM 2.11MyISAM的特点 2.12MyISAM表支持3种不同的存储格式&#xff1a; 2.2 InnoDB 2.21InnoDB特点介绍 三、InnoDB与MyISAM 区别 四、怎么样选择存储引擎 五、查看存储引擎 六、查看表使用的存储引擎 七、修改存储引擎 …

Java代码审计17之fastjson反序列化漏洞(2)

文章目录 1、类加载与反射调用1.1、类加载1.2、测试代码1.3、通过类的加载和反射调用evil类 2、Fastjson TemplatesImpl链调试2.1、链路总览2.2、调试构造利用链 3、fastjson反序列化TemplatesImpl 利⽤3.1、开启 Feature.SupportNonPublicField 得作用3.2、构造利用payload3.3…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…