Linux-信号量配合父子进程的简单使用

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化 本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。 阅读详情

在Linux中,进程间通信大致分为5类(依赖于内核)

1. 无名管道
2. 命名管道
3. 消息队列
4. 共享内存
5. 信号
6. 信号量

这里就简单演示下信号量和父子进程的搭配使用,话不多说 ,附上代码。
#include <stdio.h>
#include<signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

 union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
           };
void pGetKey(int id)//拿锁
{
	struct sembuf set;
	set.sem_num=0;//信号量编号 默认0 可以不写
	set.sem_op=-1;//让钥匙个数减一
	set.sem_flg=SEM_UNDO;
	semop(id,&set,1);
	printf("getkey\n");
}
void vPutKey(int id)//放锁
{
	struct sembuf set;
	set.sem_num=0;//信号量编号 默认0 可以不写
	set.sem_op=1;//让钥匙个数减一
	set.sem_flg=SEM_UNDO;
	semop(id,&set,1);
	printf("putkey\n");
}
int main(int argc, char const *argv[])
{
	int semid;
	key_t key;
	key=ftok(".",2);
					//信号量集合中有一个信号量
	semid=semget(key,1,IPC_CREAT|0666);//获取/没有就创建 信号量
				
	union semun initsem;
	initsem.val = 0;//设置开始锁被拿了 所以锁是0个

				//操作第0个信号量
	semctl(semid,0,SETVAL,initsem);// 初始化信号量
			//SETVAL 设置信号量的值, 设置为initsem

	int pid=fork();
	if(pid>0)
	{
		pGetKey(semid);//再拿锁

		printf("this is father\n");
		vPutKey(semid);
	}
	else if(pid==0)
	{
		vPutKey(semid);//先放锁
		printf("this is son\n");
	}
	else
	{
		printf("fork failed\n");
	}
	return 0;
}

Unity如何实现3D物体拆解组装 最近有一个需求,是做一个发动机的拆卸和安装功能,其实是一个很简单的功能,但是其中有一个点我觉的非常有意思,就是拖拽组装时,物体如何精准拖到目标位置,思路有了,但是我一直找不到实现方式,早晨刷牙时无意间想到了叉乘,我才有了解决方案。就凭这一次的灵光乍现,也很有必要写篇博客来记录一下。首先,我们先来看下我们要实现的效果,就是对一个发动机(任意多组件物体,如:车)的360°预览查看,手动拖拽拆解,手动拖拽组装。360°旋转视角远近拉伸视角点击拖拽拆卸拖拽组装。 阅读详情

相关推荐

避开CPU瓶颈:手把手教你用RK3588的DMA-BUF实现V4L2到NPU的零拷贝数据流

本文详细介绍了如何在RK3588平台上利用DMA-BUF实现V4L2到NPU的零拷贝数据流,显著提升异构计算性能。通过实战指南展示了如何配置摄像头采集、RGA图像预处理和NPU推理优化,最终实现CPU占用率降低60%、延迟减少60%的效果,特别适合YOLOv5等AI推理应用的高效部署。

weixin_30374009的博客 571

GDB调试之ptrace实现原理

目录 ptrace系统调用 ptrace使用示例 ptrace实现原理 进入被追踪模式(PTRACE_TRACEME操作) 获取被调试进程的内存数据(PTRACE_PEEKTEXT / PTRACE_PEEKDATA) 单步调试模式(PTRACE_SINGLESTEP) 小结 推荐阅读 原文地址 在程序出现bug的时候,最好的解决办法就是通过GDB调试程序,然后找到程序出现问题的地方。比如程序出现段错误(内存地址不合法)时,就可以通过GDB找到程序哪里访问了不合法的内存地...

RToax 2143

OpenEvidence DeepConsult深度分析:技术架构、临床应用与行业影响

摘要:医疗AI平台OpenEvidence通过多智能体协作系统重构临床决策流程,解决了医学信息过载难题。其DeepConsult系统严格基于同行评审文献,5-10秒内提供循证决策支持,已覆盖40%美国医生,月咨询量达850万次。该平台采用"免费工具+广告变现"模式,通过调度、检索、摘要等模块化智能体分工,实现从文献分析到临床建议的闭环处理,在USMLE测试中准确率达90%。2025年获7500万美元融资后估值突破10亿美元,成为医疗AI领域的新范式。

AllenLV的博客 2556

嵌入式学习---应用程序设计---进程的沟通方式篇

进程的交流

m0_59020601的博客 729

yolov7模型部署流程

yolov7部署流程

算法的猫 1396

保姆级教程:用达芬奇Configurator配置CAN总线(从DBC导入到Controller设置)

本文详细介绍了使用达芬奇Configurator工具从DBC文件导入到CAN总线控制器设置的全流程配置方法。通过环境准备、CAN控制器模式选择、硬件参数配置、通信参数优化及通信栈集成等关键步骤,帮助开发者高效完成AUTOSAR架构下的CAN总线开发,特别适合汽车电子领域的工程师参考。

weixin_30529023的博客 443

linux 系统编程 进程间通信--IPC(2)附测试代码

1.共享内存 共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程 都可以访问,使得多个进程可以访问同一块内存空间。共享内存是最快的 IPC 方式,它是针对其它进程间通信方式运行效率低而专门设计的,它往往与其它通信机制,譬如结合信号量来使用,以实现进程间的同步和通信。 草稿记录:共享内存中,收、发双方均可查看消息的内容 编程实践: //创建共享内存及向共享内存些入端 #include <sys/ipc.h> #include <sys

weixin_44575952的博客 569

OpenClaw 生成测试用例

OpenClaw 只是躯干,Skills 才是灵魂。很多同学觉得 OpenClaw 没用,就像是买了一台顶级电脑却没装操作系统。通过这四步走,不仅可以学会如何让 AI 干活,更重要的是,可以学会如何管理 AI 的能力。

十二测试录 737

Linux内核IPC源码——共享内存

0]. sem->count的数值>=0, 如果count>0, 说明当前信号量没有被占用, 可以获取;如果countlist来添加等待任务或者唤醒任务;[0]. 定义信号量结构体变量;[1]. 初始化信号量变量。

生活需要深度 921

王者荣耀AI绝悟如何选英雄?

王者荣耀AI绝悟如何选英雄? 【抢射手?抢中单位?「绝悟」在打王者荣耀时是如何选英雄的?】 腾讯 AI Lab 开发的 AI 智能体「绝悟」已让王者峡谷不再只是人类召唤师的竞技场,而且这个 AI 战队在上月底进化成了「完全体」。在一局完整的比赛中,英雄选择阶段是至关重要的(比如五射手或五法师阵容会有官方劝退)。 近日,腾讯 AI Lab 和上海交通大学发布的一篇论文介绍了绝悟的英雄选择策略:Ju...

不断学习,不断进步,提高自己 1万+

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1179

C/C++Unix网络编程-IPC简介

IPC是进程间通信的简称。 进程、线程与信息共享 Unix进程间的信息共享的方式: (1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样既可保护多个写入者,防止相互串扰,也可保护一个或多个读出者,防止写入者的干扰。 (2)中间的两个进程共享驻留于内核中的某些信息。是这种共享类型的一个例子,System V消息队列和System V信号量也是。现在访问共享信息的每次操

NINE_world的博客 2856

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 193

Linux进程间的通信方式(三)System V 信号量

本文主要探讨 linux 下进程间的通信方式之信号量,最后通过一个简单的示例实现一个父子进程之间操作临界资源使用信号量处理同步与互斥的功能。

Mr_Jaychong的博客 2430

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Linux系统编程】子进程被程序替换后,如何保持父子进程的通信

子进程exec系列函数后会被目标程序替换,其进程的代码和数据会被替换,但内核数据结构不会被替换(包括文件描述符,环境变量)。建立好信道后,如果直接进行程序替换,被替换后,代码和数据会被目标程序的代码和数据替换掉,那么目标程序也就不知道信道的文件描述符,也就无法和父进程通信。然后再执行exec系列函数,子进程想从信道里读数据,改向标准输入里读,子进程想向信道里写数据,改向标准输出里写。但是每个进程有3个文件描述符是一定确定的0 , 1, 2——分别是标准输入,标准输出,标准错误。方案一:文件描述符的重定向。

2301_79796701的博客 1372

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux使用mmap实现父子进程间的通信

mmap是一种高效的进程间通信方式,特别适合需要大量数据交换的场景。通过合理使用mmap,可以实现父子进程间的高效通信。本文介绍了mmap的基本概念、父子进程创建方式,以及使用mmap实现父子进程通信的具体方法和注意事项。希望读者能够通过本文掌握mmap的使用,并在实际编程中灵活应用。以上就是关于Linux父子进程使用mmap通信的详细介绍。mmap作为一种高效的IPC机制,在系统编程中有着广泛的应用。通过合理使用mmap,可以大大提高进程间通信的效率,减少数据拷贝的开销。

2501_94114815的博客 22

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

进程间通信(IPC)---------------信号(Signal)与信号量(Semaphore)

信号与信号量1.IPC的几种方式2.信号(Signal)3.信号量3.1 信号量的概念3.2 使用步骤3.3函数原型2.4代码示例 1.IPC的几种方式 首先,先来讲一下fork之后,发生了什么事情。由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但 返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回...

AJIEIT的博客 3172

Linux下的多进程通信(IPC)原理及实现方案(管道-消息队列-信号量-共享内存-套接字)

每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口,这样形成的整体就可以区别每一个套接字。一个进程扮演客户端的角色,另外一个进程扮演服务器的角色,两个进程之间相互发送接收数据,这就是基于本地套接字的进程通信。

AI天才研究院 2万+

【Linux系统】进程间通信:System V IPC——消息队列和信号量

本文介绍了SystemV IPC中的消息队列和信号量机制。消息队列允许进程通过内核维护的队列交换结构化消息,包含消息类型和内容,具有持久性、容量限制和权限控制特性。信号量本质是受保护的整型变量,通过PV原子操作实现资源互斥访问和进程同步,包含阻塞机制和等待队列管理。文章详细分析了两者的工作原理、内核数据结构(msqid_ds和semid_ds)和系统调用接口,并与共享内存进行对比,阐述了三者在SystemV IPC中的协同关系。最后解释了操作系统通过"先描述再组织"方式统一管理IPC资源

2402_82670467的博客 1539

C++父子进程通信实战:从管道到共享内存的IPC机制详解

进程间通信是操作系统并发编程的核心概念,它解决了不同进程间数据交换与协同工作的难题。其基本原理在于操作系统提供的多种IPC机制,如管道、共享内存、消息队列等,它们各有不同的数据交换方式和同步模型。掌握这些机制的技术价值在于能够构建稳定、高效的多进程应用,尤其在系统编程、高性能计算和守护进程开发中至关重要。常见的应用场景包括日志采集、任务分发、微服务框架等。本文聚焦于父子进程通信,深入探讨了匿名管道和共享内存这两种典型机制,通过C++代码示例详细解析了其实现细节、同步控制以及性能优化考量,并分享了基于RAII

weixin_34161083的博客 496

Linux进程间通信(管道,FIFO,消息队列,信号量,共享内存)

进程间通信:简称ipc(Inter-Process Communication)。进程间通信是指两个进程的数据之间产生交互。 一.无名管道(pipe) 1.特点: ①半双工(即数据只能在一个方向上流动),具有固定的写端和读端 ②只能用于父子进程或兄弟进程之间 ③可以把它当做是一个文件使用read等函数操作,但它不是普通文件,并不属于其他文件系统,只存于内存中。 2.原型: 1. #include <unistd.h> 2. Int pipe(int fd[2]); //返回值,

weixin_58670878的博客 550

进程间通信 无名管道pipe 有名管道fifo mkfifo 消息队列msg 共享内存shm 信号signal sigaction 信号量

IPC 进程间的通信 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 1、特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等

xiaolinjieya的博客 1006

进程间通信(3)----信号量

进程间通信的方式有:管道、信号量、消息队列、共享内存和socket套接字 管道、信号量、消息队列、共享内存适用于单机,即完成一台主机上的两个进程或多个进程之间的通信,socket套接字适用于网络通信,通信的进程可以运行在不同的主机上。 无名管道:无名管道是一种半双工通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指...

IT_happy_的博客 333

使用Linux下的“共享内存“实现一些简单功能

部分概念摘录自《UNIX环境高级编程》多个进程共享同一块存储区域。本机制本身不提供读写保护等同步异步机制。需要搭配信号量、锁等其他机制使用。那如果我写个父子进程、代码执行本身是有先后顺序的,那是不是本身就线程安全了,不需要加同步机制了?实现的原理是,将同一个文件映射到多个进程的地址空间。调用的第一个函数通常是shmget,它获得一个共享存储标识符。 返回值:若成功,返回共享存储ID;若出错,返回−1对于key 和 flag。有3种称作XSI IPC的IPC:消息队列、信号量以及共享存储器。他们都是发源于Sy

小羊苏C的博客 479

linux下通过共享内存在进程之间实现通信(system V)

参照书上的例程,实现在父子进程

five_kill的专栏 576

【Linux 】二十.进程间通信篇三《Linux System V IPC 完全指南:共享内存、消息队列与信号量全解》

共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据进程间通信的第一步永远是"让两个进程能看到同一块资源",资源都看不到,数据就没法传。管道是怎么实现的?匿名管道靠父子进程继承文件描述符,命名管道靠文件路径唯一,大家认准同一个路径就能找到同一份文件。不管哪种管道,本质上都是文件资源,之前给大家也介绍了,Linux下一切皆文件。之前学管道的时候就知道,进程间通信的第一步永远是"让两个进程先看到同

2501_93351213的博客 933
上一篇: exec族函数、system函数和popen函数应用
下一篇: 基于Linux 下建立的简单FTP 协议
四夕、
博客等级 码龄8年 19粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值