笔记整理—linux进程部分(6)进程间通信、alarm和pause
两个进程间通信可能是任何两个进程间的通信(IPC)。同一个进程是在同一块地址空间中的,在不同的函数与文件以变量进程传递,也可通过形参传递。2个不同进程处于不同的地址空间,要互相通信有难度(内存隔离的原因)本质上也是为了安全。
多数情况下是不会使用进程间通信的,大部分都是单进程,多线程只有在设计复杂的大型程序时候才会去使用IPC(如GUI或服务器)。IPC在中小程序上是用不上的。
linux提供四类进程间通信的方法,①管道,有名管道、无名管道。②system V IPC信号量、消息队列、共享内存。③socket套接字(一般用于网络通信)。④信号。
进程间通信IPC不常用的问题:①日常用的少,大程序才用得上。②很复杂,是linux应用编程中难度极大的部分。③细节很多。④初学困难。
管道:只允许读一次,一般情况下所说的管道是无名管道,若使用有名管道一般称为FIFO。无名管道通信原理,内核维护的一块内存,有读/写端。

管道是单向通信的,半双工的,但是一般被视为单工通信。单工通信,从左到右,单向运动。半双工,同一时间内从左到右,下一时刻能从右往左。全双工,同时支持双向运动。
为什么一般要把管道通信做成单工通信呢,其原因是,在双方都有读写的情况下进程A可能会把自己写的读写读走,让B进程没地方读信息,所以一般情况下,管道通信做的都是单工通信,本质上就是因为公共区域没区分,会发生抢读。所以就可以把这半双工通信作如下的操作:

无名管道通信,只能在父子之间进行通信父进程先创建pipe的带两个文件fd,pipe fd[2]。父进程fork子进程基础fd,父进程关闭读(或写),子进程关闭写(读)。只能在父子之间通信,这些缺点被有名管道进行修复。
有名管道,也是内核维护的一块内存,表现为一个有名字的文件,用两个进程去mkfifo创建fifo文件,通过open打开达到fd,进行通信,不要求目标为父子进程,因为这里有真实的文件存在。

system V IPC其有专用的API进程实现。分为三种方法,信号量,消息队列,共享内存。实际上用的也是内核提供的公共内存。
消息队列本质上是一个队列FIFO,内核内部维护一个FIFO,工作时A可以从队列中放东西,B从队列中读东西。
信号量,实质是一个计数器,一个计数的变量,主要用于互斥与同步(进程间互斥与资源同步等),就一个flag,可以做锁。
共享内存,内核中用一片内存,这块区域可以共同使用。
大片内存共享:A(摄像头)———>B(视频编码)———>C(视频传输)
方法①:A得到一个图像信息,复制给B一份,B去处理。
方法②:A和B用同一块内存空间共同处理图像。
实例就是LCD映射,LCD显存与代码共享一个内存空间存放图像。
共享内存适合进行大信息处理。

信号通信方式,是一种内容收到限制的异步通信机制。用于进程间通信或进程与内核通信;通信内容受到限制,只是一个信号;信号是异步的,不在同一个时钟,信号具有滞后性,同样和中断一样有不可预知性。信号的本质就是一个数字。
信号由谁处理——>进程。处理的方式有三种①忽略信号。②驳货信号(信号绑定了一个函数)。③默认处理,忽略或终止进程。不去主动的明确忽略信号,捕获信号,则会默认处理信号。
常见的信号有:
SIGINT 值为2 作用为ctrl+c时OS送给前台进程组中每个进程。
SIGPOLL/SIGIO 值为8 提示一个异步IO事件
SIGKILL 值为9 杀死进程的最终方法(不可忽略)
SIGALARM 值为14 与alarm闹钟相关
SIGCHLD 值为17 子进程停止或终止时OS向父进程发送,如wait()等待收尸
进程处理信号的方式:
sighandler_t signal(int signum, sighandler_t handler);sighandler_t handler就是处理的方法相当于中断里面的处理函数,信号与槽里面的槽函数typedef void (*sighandler_t)(int);
处理SIGINT信号默认终止进程(异常退出)
typedef void (*sighandler_t)(int);void func(int sig)
{printf("signal:%d\n",sig);
}int mian(void)
{signal(SIGINT,func);//主动捕获,默认终止进程while(1);
}signal()返回值①返回正确的处理方法(成功)②返回errnuber(SIG_ERR失败)
SIG_ERR是一个函数指针,signal返回无论正确与否都返回一个函数指针。SIG_ERR值为强制转换的-1表示err;SIG_DFL值为强制转换的0表示默认;SIG)IGN值为强制转换的1表示忽略。
signal(SIGINT,SIG_DFL)指定SIGINT为默认处理;signal(SIGINT,SIG_IGN)指定SIGINT为忽略处理。但是当使用signal()去绑定处理函数时可能会出现因为版本问题的错误。可以使用:
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
可以保证signal的其移植性。
struct sigaction {void (*sa_handler)(int);//signal中的方法void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void);};
通过传递NULL可以返回旧的处理方法
alarm函数,闹钟——到店了应该干什么。
unsigned int alarm(unsigned int seconds);
时间到了,返回一个SIGALRM信号,若传一个0,会取消之前没执行完的闹钟,在一个闹钟没完成时,会返回剩余时间。
typedef void (*sighandler_t)(int);void func(int sig)
{printf("signal:%d\n",sig);
}int main()
{unsigned int ret=-1;signal(SIGALRM,func);ret=alarm(3);while(1);
}
struct sigaction act={0};act.sa_handler=func;sigaction(SIGALRM,&act,NULL);对上面进行替换。
typedef void (*sighandler_t)(int);void func(int sig)
{printf("signal:%d\n",sig);
}int main()
{unsigned int ret=-1;struct sigaction act={0};act.sa_handler=func;sigaction(SIGALRM,&act,NULL);ret=alarm(3);while(1);
}
内核只给一个进程提供一个alarm时钟,只能定一个闹钟,一个没结束再次调用将会返回上一个闹钟还剩余的时间,覆盖闹钟重新计时。
pause函数,使进程挂起,让进程暂停运行,交出cpu,利用该函数使进程卡住,要退出该函数需要信号进行输入,进程被唤醒。所以可以使用alarm与pause模拟sleep()。
typedef void (*sighandler_t)(int);void func(int sig)
{
}void my_sleep(unsigned int seconds)
{struct sigaction act={0};act.sa_handler=func;sigaction(SIGALRM,&act,NULL);alarm(seconds);pause();
}int main()
{my_sleep(1);printf("hi\n");my_sleep(4);printf("I am\n");my_sleep(3);printf("jack\n");return 0;
}
相关文章:
笔记整理—linux进程部分(6)进程间通信、alarm和pause
两个进程间通信可能是任何两个进程间的通信(IPC)。同一个进程是在同一块地址空间中的,在不同的函数与文件以变量进程传递,也可通过形参传递。2个不同进程处于不同的地址空间,要互相通信有难度(内存隔离的原…...
Java网络通信—UDP
0.小记 1.udp通信不需要建立socket管道,一边只管发,一边只管收 2.客户端:将数据(byte)打包成包裹(DatagramPacket),写上地址(IP端口),通过快递站&…...
k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
clusterIP作为k8s中的服务, 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod,pod由控制器自动部署,自动维护 那么问题是service的可用…...
vue框架和uniapp框架区别
文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...
828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)
前言 Flexus X实例内嵌智能应用调优算法,性能强悍,基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍,性能模式更是超越多系列旗舰型云主机,为企业业务提供强劲动力。 💼 Flexus X Zabbix:打造…...
JAVA基础-线程(Thread)、多线程(Multi-threaded)
1、知识铺垫 要想了解什么是线程,首先要搞明白线程与进程的区别,并行与并发的区别 1.1 线程与进程 进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程;…...
hystrix微服务部署
目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程(修改一下工程的注册名字) 2.运行登录nacos网站查看运行效果(默认密码nacos,nacos) 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...
使用百度文心智能体创建多风格表情包设计助手
文章目录 一、智能定制,个性飞扬二、多元风格,创意无限 百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术&…...
【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)
前面已经写了两篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...
css的背景background属性
CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...
Cypress自动化测试实战:构建高效的前端测试体系
在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...
【YOLO学习】YOLOv2详解
文章目录 1. 概述2. Better2.1 Batch Normalization(批归一化)2.2 High Resolution Classifier(高分辨率分类器)2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)2.4 Dimension Clusters&…...
windows 录音编码为flv格式时,pcm采样格式
这里使用的是0x3e,转换为二进制: 0 0 1 1 1 1 1 0 前四个字节为3,表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样, 16个bit,单声道。 故,windows 音频采样不支持48000HZ频率...
Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
继续讲一些Qt开发中的技巧操作: 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…...
51c自动驾驶~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案!HTCL:分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍,HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法,甚至在和…...
Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…...
PHP魔幻(术)方法
PHP中的魔幻方法,也被称为魔术方法(Magic Methods),是一组具有特殊功能的方法。这些方法在PHP中有固定的名称,并且会在特定的时机自动被PHP调用,而无需开发者显式调用。它们通常用于执行一些特殊的操作&…...
VS开发 - 静态编译和动态编译的基础实践与混用
目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件(从VS2015起) 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库(Runtime Library)就是WINDOWS系统…...
Golang | Leetcode Golang题解之第451题根据字符出现频率排序
题目: 题解: func frequencySort(s string) string {cnt : map[byte]int{}maxFreq : 0for i : range s {cnt[s[i]]maxFreq max(maxFreq, cnt[s[i]])}buckets : make([][]byte, maxFreq1)for ch, c : range cnt {buckets[c] append(buckets[c], ch)}an…...
零信任如何增强网络物理系统 (CPS) 安全性
远程访问对于管理关键基础设施至关重要,因为它允许企业优化和扩展运营并保持效率。然而,它也带来了许多安全漏洞,而且随着连接设备数量的增加,这些漏洞只会越来越多。 到 2025 年,企业和消费者环境中的物联网设备数量…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
