linux-进程间通信

进程的通信是两个或多个进程实现数据的交互,让不同的进程看到同一份资源,而这份资源是由操作系统创建管理的。如果让其中一个进程来提供的话会破坏该进程的独立性,因为这个进程内部的数据可以被其他进程看到,那这个独立性就遭到了破坏。

管道

管道是一个内存级的文件,它并不存储在磁盘当中,而是只在内存存在,原本的文件缓冲区就成了存储数据的地方,读取该文件就是读取该文件的缓冲区。

管道文件是有固定大小的。

管道通信的原理

管道通信使用pipe系统调用以读写直接打开一个内存级文件,再创建一个子进程,继承指向该文件的文件描述符表,其中一个进程负责写,另一个进程负责读,负责写的进程关闭这个文件的读端口,负责读的关闭这个文件的写端口,这样就实现了进程单向通信。

但是管道通信只适用于有关系的进程,也就是继承下来了同一份字符描述符表,指向了该内存及文件的进程。

这个参数是一个输出型参数,需要的是一个数组,这个整数数组会把以读写方式打开的文件的两个文件描述符通过这个数组带出来。

返回值小于0说明创建失败

0是读下标

1是写下标

在进程通信时,进程之间会有协同的关系,如果一个文件正在写入,那么读端口就会等待写好,如果没有东西可以读取,那么就会等待写入端口写新的数据。

管道通信时会出现的四种情况

1.读写端正常,如果管道为空,那么读端就会阻塞。

2.读写端正常,如果管道为满,那么写端就会阻塞。

3.读端正常读,写端关闭,会读到0,表示读到了文件(pipe)结尾,且不会阻塞。

4.写端正常读,读端关闭,写端的进程会被操作系统发送信号杀掉。

命名管道

命令行创建

指令:

mkfifo 管道文件名 

代码创建

 成功返回0,失败返回-1.

第一个参数是文件名

第二个参数是文件权限

这个是在代码当中删除文件的函数,参数是文件路径名。

命名管道打开,在只有一方以写打开文件或以读打开文件时,会阻塞等待另一方打开文件才会继续执行。

共享内存

共享内存的生命周期是随内核的,如果用户不主动释放,或者对内核重启,共享内存会一直存在。

创建共享内存的大小推荐4096的整数倍,也就是一个内存块的大小。

一旦有了共享内存,挂接到了自己的内存空间中,你直接把他当成你的内存空间来用即可,不需要系统调用,直接拿着地址用就行 

共享内存申请是一个系统调用,申请失败会返回-1,申请成功会返回一个共享内存的标识符。

第一个参数key是一个数字,有着唯一性,每一个共享内存有着唯一的一个key,如果这个key不存在,那么就可以新建一个共享内存,如果存在,那就能让调用的进程和其他进程共享这一块内存。

key的创建

第一个参数是一个字符串,第二个参数是一个数字,这个调用会用一套算法来将这两个参数计算返回一个key。想要获得同样的key,那两个参数也要一样。 

第二个参数size是开辟的共享内存的大小。

第三个参数是要实现的功能选项。

 IPC_CREAT 是一个宏定义,这个宏定义是一个整数,在二进制里面只有一个比特位为1,使用比特位来调用对应的功能。

IPC_CREAT 单独调用是,申请一块共享内存,若不存在,则创建,存在,则获取,返回。

IPC_CREAT|IPC_EXCL 是申请一块共享内存,不存在则创建,存在就报错返回。

同时也可以加入或权限进去

例:

IPC_CREAT|IPC_EXCL|0666

释放共享内存

 

ipcs -m

查看共享内存的key和shmid

key是key

shmid是shmid

owner是创建者

perms是权限

bytes是大小

nattch是挂接数 

ipcrm -m shmid  删除对应的共享内存

共享内存挂接

第一个参数是shmid,第二个参数是想把这个共享内存放在虚拟地址共享区的什么位置,直接传NULL就可以,第三个参数是权限,如果想直接用之前申请共享内存时的权限,传输0就可以。

返回的就是该共享内存在虚拟地址的起始位置。

信号量

临界资源是将共享资源进行上锁之后的称呼,上锁后,一个进程访问这块临界资源时,其他的进程不能访问,管道文件就是临界资源。

临界资源分为两种,一种是只有一块整体的空间就是。这种临界资源的信号量是二元信号量,就是互斥,只存在0和1两种。

也可以将临界资源按照规定分块,多少块,信号量就是多少。

信号量本质是一个计数器,在使用临界资源时,需要先申请信号量,申请信号量实际上就是将信号量--,信号量为0时不能够再申请了,就算申请好不去使用,这块对应的临界资源也不能被其他申请。

申请好信号量之后才能去访问临界资源。

调用临界资源的那些代码被称为临界区域。

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

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

相关文章

基于阿里云服务器部署静态的website

目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…

Java算法OJ(10)哈希表练习

目录 1.前言 2.正文 2.1俩数之和 2.2无重复字符的最长子串 2.3罗马数字转整数 2.4整数转罗马数字 3.小结 1.前言 哈喽大家好吖,今天来分享几道哈希表相关的练习题,操作比较基础但是思想比较重要,另外有许多思路与解法都是学习参照题解…

二叉树:堆的建立和应用

在建立堆之前,我们要知道什么是树和二叉树 树 树是一种非线性的数据结构,它是由n(n>0)个结点组成的一个具有层次关系的集合,之所以把它叫做树,是因为它长得像一棵倒挂的树,也就是根在上面&…

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册: 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 , 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册,在动态注册不稳定时使用,特点是:稳定&…

postgresql按照年月日统计历史数据

1.按照日 SELECT a.time,COALESCE(b.counts,0) as counts from ( SELECT to_char ( b, YYYY-MM-DD ) AS time FROM generate_series ( to_timestamp ( 2024-06-01, YYYY-MM-DD hh24:mi:ss ), to_timestamp ( 2024-06-30, YYYY-MM-DD hh24:mi:ss ), 1 days ) AS b GROUP BY tim…

调试器 gdb/cgdb 的使用

一. touch mycode.c vim mycode.c cgdb 下载 Ubuntu:sudo apt-get install -y cgdb Centos: sudo yum install -y cgdb Linux 下我们编译好的代码无法直接调试 g/gcc 默认的工作模式是release模式 程序要调试,必须是debug模式,编译时…

通过DataWorks实现MaxCompute跨项目迁移

本文为您介绍如何配置不同MaxCompute项目并实现数据迁移。 背景信息 本文使用的被迁移的原始项目为教程《简单用户画像分析(MaxCompute版)》中的WorkShop2023项目,您需要再创建一个迁移目标项目,用于存放原始项目的表、资源、配置…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive

前言 ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型,而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象,但 Vue3 官方文档更推荐使用 ref。 我的想法,ref就是比reactive好用,…

ctfshow-Misc入门(1-16)

misc1 查看图片得到flag misc2 1、打开文本,发现以“塒NG”开头 3、修改文件格式为png格式 4、查看图片,得到flag *遇到的问题:无法直接修改后缀名 *解决方法:需要点击文件夹,然后点击查看,将文件拓…

自动驾驶概念

1.线控底盘 由五大系统构成:线控转向、线控制动系统、线控换挡、线控油门踏板以及线控悬架。 2.自动驾驶分级 L1级别,也被称作驾驶支援阶段。在这一阶段,车辆系统能够根据驾驶环境来辅助驾驶者进行方向盘操作或减速操作中的一项&#xff0c…

【C】错误的变量定义导致sprintf()‌输出错误

问题描述 刚刚写一个用AT指令透传相关的函数,需要用到sprintf()‌拼接字符串。 结果发现sprintf()‌拼接出来的内容是错误的,简化后的代码如下: const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的&#xff0…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想,将代码与数据分离,易维护,易上手。使用yaml编写编写测试用例,利用requests库发送请求,使用pytest管理用例,allure生成…

内网渗透横向移动1

1.信息收集 (1)判断域控 shell net time /domain shell ping OWA2010CN-God.god.org (2)主机探测 浏览探测->网络探测 主机列表显示: (3)域用户收集: shell net user /domain…

C++初阶——类和对象(下)

目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…

数据指标与标签在数据分析中的关系与应用

导读:分享数据指标体系的文章很多,但讲数据标签的文章很少。实际上,标签和指标一样,是数据分析的左膀右臂,两者同样重要。实际上,很多人分析不深入,就是因为缺少对标签的应用。今天系统的讲解下…

Exploring Prompt Engineering: A Systematic Review with SWOT Analysis

文章目录 题目摘要简介方法论背景相关工作评估结论 题目 探索快速工程:基于 SWOT 分析的系统评价 论文地址: https://arxiv.org/abs/2410.12843 摘要 在本文中,我们对大型语言模型 (LLM) 领域的提示工程技术进行了全面的 SWOT 分析。我们强…

Android 常用命令和工具解析之内存相关

目录 1 基本概念 1.1 PSS & RSS & USS & VSS 1.1.1 PSS 1.1.2 RSS 1.2 Dirty & Clean & SwapPss 1.2.1 Private Dirty 1.2.2 Private Clean 1.2.3 SwapPss Dirty 1.3 Swap & buffers & cache 1.3.1 Swap 1.3.2 buffers 1.3.3 cache 2…

使用Go 语言连接并操作 MySQL 数据库

新建项目,我这里使用的vscode: 1.新建项目初始化: 手动创建工程文件夹go安装目录->src->projectName 在项目下创建 main.go文件: 在vscode中点击文件->打开文件夹,选择刚刚新建的文件夹。打开后&#xff0…

YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》 一、 模块介绍 论文链接:https://arxiv.org…