posix ipc之匿名信号量

news2024/9/24 21:19:46

note

使用信号量进行进程间通信时,信号量要放置在共享内存上;若是线程间通信,放堆上或全局变量区就行

code

// 使用信号量进行进程间通信时,信号量要放置在共享内存上;若是线程间通信,放堆上或全局变量区就行

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <fcntl.h>

const char* shm_obj1 = "shm1";
const char* shm_obj2 = "shm2";
int shm_id1 = -1;
int shm_id2 = -1;
void* shm_handle1 = NULL;	// 对应生产量
void* shm_handle2 = NULL;	// 对应容纳量
sem_t* sem_cnt = NULL;  // 已生产量
sem_t* sem_capcity = NULL; // 可容纳量
const int sem_between_threads = 0;  // 线程间通信
const int sem_between_processes = 1;    // 进程间通信

// 父进程负责生产
void parent_work(void) {
    int ret = -1;
    int val = 0;
    int i = 0;
    
	for (i = 0; i < 10; i++) {
        ret = sem_wait(sem_capcity);
        if (ret == -1) {
            fprintf(stderr, "parent process sem_wait error,%s\n", strerror(errno));
        }
        else if (ret == 0) {
            (void)sem_getvalue(sem_capcity, &val);
            fprintf(stdout, "parent process get sem_capcity value:%d\n", val);
            (void)sem_post(sem_cnt);
        }
        sleep(2);
    }
	

    wait(NULL);
    (void)sem_destroy(sem_cnt);
    (void)sem_destroy(sem_capcity);
	(void)shm_unlink(shm_obj1);
	(void)shm_unlink(shm_obj2);
    exit(EXIT_SUCCESS);
}

// 子进程负责消费
void child_work(void) {
    int ret = -1;
    int val = 0;
    int i = 0;
    for (i = 0; i < 10; i++) {
        ret = sem_wait(sem_cnt);
        if (ret == -1) {
            fprintf(stderr, "child process sem_wait error,%s\n", strerror(errno));
        }
        else if (ret == 0) {
            (void)sem_getvalue(sem_cnt, &val);
            fprintf(stdout, "child process get sem_cnt value:%d\n", val);
            (void)sem_post(sem_capcity);
        }
        sleep(1);
    }
    exit(EXIT_SUCCESS);
}

int main(int argc, char** argv) {
    int ret = -1;
    pid_t pid = 0;

	shm_id1 = shm_open(shm_obj1, O_CREAT|O_RDWR, 666);
	if (shm_id1 == -1) {
		fprintf(stderr, "parent process shm_open shm_obj1 error,%s\n", strerror(errno));
		exit(EXIT_FAILURE);
	}

	shm_id2 = shm_open(shm_obj2, O_CREAT|O_RDWR, 666);
	if (shm_id1 == -1) {
		fprintf(stderr, "parent process shm_open shm_obj2 error,%s\n", strerror(errno));
		(void)shm_unlink(shm_obj1);
		exit(EXIT_FAILURE);
	}

	ftruncate(shm_id1, sizeof(sem_t));
	ftruncate(shm_id2, sizeof(sem_t));

	shm_handle1 = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, shm_id1, 0);
	if (shm_handle1 == MAP_FAILED) {
		fprintf(stderr, "parent process mmap shm_id1 error,%s\n", strerror(errno));
		(void)shm_unlink(shm_obj1);
		(void)shm_unlink(shm_obj2);
		exit(EXIT_FAILURE);
	}
	
	shm_handle2 = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, shm_id2, 0);
	if (shm_handle2 == MAP_FAILED) {
		fprintf(stderr, "parent process mmap shm_id2 error,%s\n", strerror(errno));
		(void)shm_unlink(shm_obj1);
		(void)shm_unlink(shm_obj2);
		exit(EXIT_FAILURE);
	}

	sem_cnt = shm_handle1;
	sem_capcity = shm_handle2;

    // 可存储量初始化为10
    ret = sem_init(sem_capcity, sem_between_processes, 10);
    if (ret == -1) {
        fprintf(stderr, "parent process sem_init sem_capcity error,%s\n", strerror(errno));
		(void)shm_unlink(shm_obj1);
		(void)shm_unlink(shm_obj2);
        exit(EXIT_FAILURE);
    }

    // 已生产量初始化为0
    ret = sem_init(sem_cnt, sem_between_processes, 0);
    if (ret == -1) {
        fprintf(stderr, "parent process sem_init sem_cnt error,%s\n", strerror(errno));
        (void)sem_destroy(sem_capcity);
		(void)shm_unlink(shm_obj1);
		(void)shm_unlink(shm_obj2);
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "parent process fork error,%s\n", strerror(errno));
        (void)sem_destroy(sem_cnt);
        (void)sem_destroy(sem_capcity);
		(void)shm_unlink(shm_obj1);
		(void)shm_unlink(shm_obj2);
        exit(EXIT_FAILURE);
    }

    if (pid > 0) {
        fprintf(stdout, "i am parent process,pid:%d\n",getpid());
        parent_work();
    }
    else if (pid == 0) {
        fprintf(stdout, "i am child process,pid:%d\n",getpid());
        child_work();
    }

    return 0;
}


// sem_init\sem_destroy


test

 

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

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

相关文章

Python批量实现Word、EXCLE、PPT转PDF文件

一、绪论背景 在日常办公和文档处理中&#xff0c;有时我们需要将多个Word文档、Excel表格或PPT演示文稿转换为PDF文件。将文档转换为PDF格式的好处是它可以保留文档的布局和格式&#xff0c;并且可以在不同平台上进行方便的查看和共享。 本篇博文将介绍如何使用Python编程语言…

0714两小时配置完服务器环境

之前那个222的服务器&#xff0c;不知道下载的什么东西&#xff0c;包含了一个挖矿程序&#xff0c;然后就停掉了它。 重新配置一个环境在220服务器上。 1、配置anaconda :(直接下载的这个博客的那个版本&#xff09; https://blog.csdn.net/m0_46926492/article/details/1293…

【分布式】ceph存储

目录 一、存储基础单机存储设备单机存储的问题商业存储解决方案 二、 分布式存储 &#xff08;软件定义的存储 SDS&#xff09;分布式存储的类型Ceph 优势Ceph 架构Ceph 核心组件Pool中数据保存方式支持两种类型&#xff1a;Pool、PG 和 OSD 的关系OSD 存储后端BlueStore 的主要…

本地生活直播,和电商直播有什么不一样?

直播正在成为零售业的标配&#xff0c;当下最新的一条赛道是“本地生活直播”。 &#xff08;商家开始在美团等平台进行本地生活直播。摄影&#xff1a;李崧稷&#xff09; 今年618&#xff0c;在老牌电商平台拉着无数网店&#xff0c;拼尽全力想要堆高销量的时候&#xff0c;一…

k8s之Pod详解

目录 一、Pod基础概念1.1 在Kubrenetes集群中Pod有如下两种使用方式1.2 kubernetes中的pause容器主要为每个容器提供以下功能1.3 Kubernetes设计这样的Pod概念和特殊组成结构有什么用意&#xff1f; 二、Pod分类三、容器的分类3.1 pause基础容器&#xff08;infrastructure con…

[SCTF2019]creakme

前言 主要是SEH解密然后AES加密 分析 SEH main函数中获取到程序句柄也就是首地址&#xff0c;然后进入图中函数找到.SCTF段地址后产生异常&#xff0c;在异常中进行代码自解密 装载的SEH异常处理函数 因为在异常中有调试判断&#xff0c;所以处于调试状态中将异常抛给调试者…

玩转内存修改函数——【C语言】

在上篇博客中&#xff0c;我们学习了字符串函数&#xff0c;针对一些字符串我们可以做出一系列操作。接下来我们将学习一些内存修改函数&#xff08;#inlcude<string.h>&#xff09;&#xff0c;让我们一起走进mempy、memmove、memcmp函数中。 目录 mempcy函数​编辑 m…

leetcode刷题(轮转数组、买股票的最佳时机、买卖股票的最佳时机2、跳跃游戏、跳跃游戏2、最大子序列交替和、交替数字和、下降路径最小和)

目录 1、轮转数组 2、买卖股票的最佳时机 3、买卖股票的最佳时机② 4、跳跃游戏 5、跳跃游戏2 6、最大子序列交替和 7、交替数字和 8、下降路径最小和 1、轮转数组 class Solution():def rotate(self, nums, k):def reverse(i, j): #逆置数组while i < j:nums[i]…

Oracle Apex制作一个简单的交互式报表页面&页设计

目录 创建好一个菜单表 简单查询一下&#xff1a; 创建交互式报表 工作报表展示​编辑 菜单报表展示​编辑 页设计器 改变布局样式 修改标签内容 添加验证&#xff06;更改必填项 注意&#xff01; 在主页进行跳转 页跳转按钮 主页可以跳转到指定报表 面包屑 报表也可…

Clickhouse数据一致性和物化视图

Clickhouse 一、数据一致性的保证1.通过Group by对数据去重2.通过 FINAL 查询 二、物化视图1.物化视图与普通视图的区别2.优缺点3.基本语法 三、MaterializeMySQL引擎1.特点2.使用细则 四、常见问题排除分布式 DDL某数据节点的副本不执行数据副本表和数据不一致副本节点全量恢复…

【uniapp开发小程序】设置全屏的开屏广告、长按识别图片、点击跳转通话 拨打电话

设置全屏的开屏广告需求实现 效果图&#xff1a; 点击跳转其他小程序&#xff1a; uni.navigateToMiniProgram() 官方文档&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 // 示例代码 uni.navigateToMiniProgram({appId: ,path: pages/index/index?id123,ext…

Cilium核心技术-eBPF XDPTC介绍

eBPF 是一项革命性技术&#xff0c;它能在内核中运行沙箱程序&#xff08;sandbox programs&#xff09;&#xff0c; 而无需修改内核源码或者加载内核模块。 eBPF的一个重要特性是能够使用高级语言(如C)来实现程序。LLVM有一个eBPF后端&#xff0c;用于编辑包含eBPF指令的ELF文…

WEB:Web_php_unserialize

背景知识 反序列化函数及绕过 正则表达式及绕过 题目 源码解析&#xff08;参考链接在最后&#xff09; <?php class Demo { //定义一个类private $file index.php; //变量属性public function __construct($file) { //类方法$this->file $file; …

分布式锁与同步锁

什么是分布式锁 分布式锁是一种在分布式系统中用于协调多个节点访问共享资源的机制。在分布式系统中&#xff0c;由于存在多个节点并行执行任务&#xff0c;可能会出现竞争条件和数据不一致的问题。分布式锁通过约束同一时刻只有一个节点能够获得锁的方式&#xff0c;确保了对…

【计算机视觉】DINOv2(Facebook自监督视觉学习)的环境部署和使用代码示范(含源代码)

文章目录 一、导读二、环境部署三、使用示例 我的代码示范已经上传了Kaggle平台&#xff0c;具体的笔记地址为&#xff1a; https://www.kaggle.com/code/holmes0610/dinov2一、导读 DINOv2&#xff1a;在没有监督的情况下学习鲁棒的视觉特征 这是第一种训练计算机视觉模型的…

2023爱分析·AIGC厂商全景报告|爱分析报告

关键发现 通用大模型市场当前虽入局者众多&#xff0c;但终局将高度集中&#xff0c;未来将由5-6家厂商主导&#xff1b;应用层厂商及甲方企业应着眼终局&#xff0c;从大算力、巨量数据集、端到端AI工程化能力以及应用生态伙伴等维度综合考虑&#xff0c;慎重选择合作伙伴。 …

【LeetCode每日一题合集】2023.7.10-2023.7.16

文章目录 16. 最接近的三数之和排序 双指针 1911. 最大子序列交替和解法——动态规划 2544. 交替数字和&#xff08;简单模拟&#xff09;931. 下降路径最小和&#xff08;线性DP&#xff09;979. 在二叉树中分配硬币⭐⭐⭐⭐⭐&#xff08;dfs&#xff09;18. 四数之和&#…

[JAVA]程序逻辑控制,输入输出

&#x1f349;内容专栏&#xff1a;【JAVA】 &#x1f349;本文脉络&#xff1a;程序逻辑控制&#xff0c;if语句&#xff0c;switch循环&#xff0c;while循环&#xff0c;for循环&#xff0c;do while循环输入输出&#xff0c;例子 &#x1f349;本文作者&#xff1a;Melon_西…

Python:基于matplotlib与mayavi的3D可视化

文章目录 &#xff08;1&#xff09;基于matplotlib的3D可视化&#xff08;2&#xff09;基于mayavi的3D可视化&#xff08;2.1&#xff09;立方体&#xff08;2.2&#xff09;体素体 3D可视化是一种用于呈现三维数据的方法&#xff0c;它可以帮助我们更好地理解和分析复杂的空…

搭建 Java 部署环境,部署 Web 项目到 Linux

为了进行部署&#xff0c;把写好的 java web 程序放到 Linux 上&#xff0c;需要先把对应的依赖的软件 (环境) 搭建好&#xff0c;安装一些必要的软件程序 JDKTomcatMySqL jdk 直接使用包管理器进行安装(基于yum安装) 一、yum 1、认识 yum yum (Yellow dog Updater, Modified…