当前位置: 首页 > news >正文

笔记整理—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 线程与进程 进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程&#xff1b…...

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 年,企业和消费者环境中的物联网设备数量…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

密码学基础——SM4算法

博客主页:christine-rr-CSDN博客 ​​​​专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...

【2D与3D SLAM中的扫描匹配算法全面解析】

引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...