Linux基础 (十一):进程间通信

       Linux进程间通信(Inter-Process Communication, IPC)是指在不同进程之间交换数据或信息的机制。由于进程间不能直接共享内存,Linux 提供了多种 IPC 机制来实现进程间的通信。主要为:管道、信号量、共享内存、消息队列、套接字。

目录

一、管道

1.1 有名管道

1.1.1 创建有名管道文件

1.1.2 进程A打开管道文件写入数据

1.1.3 进程B打开管道文件读取数据

​1.1.4 进行通信

1.1.5 管道读写机制分析

1.1.6 注意事项

1.1.7 面试题总结

1.2 无名管道

1.2.1 创建无名管道文件

1.2.2 pipe()使用示例

1.2.3 父子进程利用无名管道进行通信

1.2.4 无名管道使用注意事项

二、信号量

2.1 信号量的基本概念(面试题)

2.2 操作信号量的接口介绍

2.2.1 依赖的头文件

2.2.2 创建一个信号量或者获取一个已经存在的信号量

2.2.3 对信号量进行P或者V操作(加或者减1)

2.2.4 对信号量进行初始化或者删除信号量

2.3 自定义实现对信号量的操作

2.4 信号量控制进程示例:两个进程同时使用打印机资源

2.4.1 题目描述

2.4.2 不进行控制

2.4.2 利用信号量进行控制

2.5 面试题

2.5.1 题目描述

2.5.2 控制思路

2.5.3 代码实现


一、管道

      管道可以用来在两个进程之间传递数据,如: ps -ef | grep “bash”, 其中‘|’就是管 道,其作用就是将 ps 命令的结果写入管道文件,然后 grep 再从管道文件中读出该数据进行 过滤。 思考: 如果进程 a 要将从键盘获取的数据循环传递给另一个进程 b, 用已具备的知识思考应该如何完成?

1.1 有名管道

1.1.1 创建有名管道文件

       有名管道可以在任意两个进程之间通信,有名管道创建的方式有两种如下:

1.1.2 进程A打开管道文件写入数据

1.1.3 进程B打开管道文件读取数据

1.1.4 进行通信

需要注意:通信的前提是双方都要打开管道!  使用管道文件时,必须要同时打开俩个文件,且必须有一个是只读文件,另一个是只写文件。只打开一个文件,只打开一个只读或只写文件,会阻塞在open管道文件这里,等到另一个文件打开了,才会执行下面。

如何解决呢?再打开另外一个终端。

1.1.5 管道读写机制分析

1.1.6 注意事项

1.1.7 面试题总结

1.2 无名管道

1.2.1 创建无名管道文件

      无名管道主要应用于父子进程间的通信。 无名管道的创建如下:无名管道,没有名字,只能靠文件描述符,文件描述符不能给到别的进程,只能fork,让子进程拿到数据。因此,应该先创建无名管道,再fork产生子进程。

1.2.2 pipe()使用示例

1.2.3 父子进程利用无名管道进行通信

利用无名管道进行通信:父进程写入数据,子进程读取数据。

1.2.4 无名管道使用注意事项

二、信号量

2.1 信号量的基本概念(面试题)

      信号量(Semaphore)是一种用于同步进程间或线程间访问共享资源的机制。信号量可以用于控制对公共资源的访问,以避免竞争条件和实现互斥。信号量在操作系统中起到非常重要的作用,尤其是在多进程和多线程环境中。

信号量是一种特殊的变量,其值可以用来控制对公共资源的访问。信号量主要有两种类型:

  1. 计数信号量(Counting Semaphore):值可以是非负整数,表示可用资源的数量。
  2. 二进制信号量(Binary Semaphore):也称为互斥量(Mutex),其值只能是0或1,主要用于实现互斥访问。

2.2 操作信号量的接口介绍

2.2.1 依赖的头文件

2.2.2 创建一个信号量或者获取一个已经存在的信号量

semget是可以创建信号量也可以获取已经存在的信号量的,第一个参数是key 两个进程想使用同一个信号量,只要key值相同就可以;第二个参数是创建信号量的个数;第三个参数是标志位,创建信号量的权限。

2.2.3 对信号量进行P或者V操作(加或者减1)

semop对信号量进行P操作或者V操作(信号量加一或者减一)。  

2.2.4 对信号量进行初始化或者删除信号量

意:要对这个联合体在头文件sem.h进行声明。 

semctl既可以初始化信号量 也能销毁信号量,第一个参数是,创建的信号量的id(semget 创建之后的返回值);第二个参数是信号量的下标,信号量的下标从0开始,如果只有一个信号量就为0;第三个参数是初始化信号量(SETVAL),还是删除一个信号量(IPC_RMID)。注意:如果是删除信号量,它会将所有的信号量进行删除。

2.3 自定义实现对信号量的操作

       创建对应的sem.h对信号量的操作函数进行声明,以及对联合体semun进行定义。另外创建sem.c对函数进行具体实现,这样在后面的利用信号量对进程控制时,引入这个头文件,然后直接调用函数即可,非常方便!

static int semid=-1;
void sem_init()
{semid=semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);//1代表创建一个信号量,IPC_CREAT没有就创建,有就获取。IPC_EXCL有就返回-1,因为创建的时候要初始化,所以要加这个。if(semid==-1)//跟据返回值判断信号量是否创建过{semid=semget((key_t)1234,1,0600);//再次获取这个id的信号量 此时的 1和0600都是占位用的,因为前面创建的时候已经定义过了。if(semid==-1){printf("semget err\n");//没有空间了,创建不了了}}else{union semun a;a.val=1;//用联合体来初始化信号量的初始值if(semctl(semid,0,SETVAL,a)==-1)//0代表下标为0的信号量{printf("semctl init err\n"); //初始化信号量失败}}
}
void sem_p()
{struct sembuf buf;//创建结构体buf.sem_num=0;//下标为0,只有一个信号量buf.sem_op=-1;//对信号量进行-1操作buf.sem_flg=SEM_UNDO;//防止进程在进行p操作时突然崩掉,信号量就不会释放了,其他进程一直阻塞住,对信号量进行不了操作,系统在进程进行p操作时会记录下来,如果崩掉,系统会把信号量还原。if(semop(semid,&buf,1)==-1)//这里的1代表只有一个结构体{printf("p err\n");}
}
void sem_v()
{struct sembuff buf;buf.sem_num=0;buf.sem_v=1;buf.sem_flg=SEM_UNDO;if(semop(semid,&buf,1)==-1){printf("v err\n");}
}
void sem_destroy()
{if(semctl(semid,0,IPC_RMID)==-1)//0是占位用,最后一个加不加结构体地址都无所谓,加了也不看。{printf("destroy err\n");}
}

2.4 信号量控制进程示例:两个进程同时使用打印机资源

2.4.1 题目描述

由于打印机同一时刻 只能被一个进程使用,所以输出结果不应该出现 abab,如何控制呢?

2.4.2 不进行控制

A进程使用打印机资源

 B进程使用打印机资源

运行结果

2.4.2 利用信号量进行控制

如何控制?思路?

加入信号量控制的A进程

加入信号量控制的B进程

介绍几个常用命令:

  1. ipcs 可以查看消息队列 共享内存段 信号量
  2. ipcs -s 只查看信号量
  3. ipcrm -s id 删除信号量

利用信号量控制进程之后的结果

2.5 面试题

2.5.1 题目描述

2.5.2 控制思路

2.5.3 代码实现

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

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

相关文章

C++三方库编译之GCC11.3.0

本系列准备持续更新,目的是将网上开源的三方库的编译过程与步骤,无脑展示,内容纯执行脚本与代码,不讲原理,也不科普库。 三方库编译很简单的(三板斧:configuremakeinstall),为啥还需要整理&…

[Cesium学习]

底图切换 Cesium之底图切换_cesium地图切换-CSDN博客 ImageryProvider Cesium中比例尺设置 cesium给地图添加比例尺学习踩坑记录_cesium 比例尺-CSDN博客 webpack与less-loader版本对应问题 报错this.getOptions is not a function at Object.lessLoader”指的是在使用we…

halcon 传统缺陷检测

一、电路检测 算子解释 dyn_threshold *dyn_threshold 利用局部阈值分割图像*OrigImage (input_object):原始图像*ThresholdImage (input_object):处理后图像(一般采用滤波处理)*RegionDynThresh (output_object)&#xff1…

操作系统 - 文件管理

文件管理 考纲内容 文件 文件的基本概念;文件元数据和索引节点(inode) 文件的操作:建立,删除,打开,关闭,读,写 文件的保护;文件的逻辑结构;文件的物理结构目录 目录的基…

在Android系统中运行i2c tools

步骤 安装交叉编译工具 验证是否安装arm-none-eabi-gcc: arm-none-eabi-gcc -v安装:sudo apt install gcc-arm-none-eabi 安装 i2c-tools 下载i2c-tools源码: https://www.kernel.org/pub/software/utils/i2c-tools/ 编译 查看当前cpu架构:adb shell getprop r…

辅助驾驶ADAS功能算法介绍

一、ADAS功能分类 按照行驶域划分,将ADAS功能分为行车功能、泊车功能和主动安全功能。 行车功能 ACC(Adaptive Cruise Control)自适应巡航控制TJA(Traffic Jam Assist)交通拥堵辅助LCC(Lane Centering Control)车道居中控制ICC(Integration Cruise Control)智能巡航系…

const指针,星号判断方法

一 示例代码 1. const char *p // 指向常量的指针 2. char const *p // 指向常量的指针 3. char * const p // 指针常量二 判断方法 const在星号左边,指向常量的指针,指针p可修改。 const在星号右边,指针常量,指针p不可修改。

【Spring】DynamicDataSourceHolder 动态数据源切换

【Spring】DynamicDataSourceHolder 动态数据源切换 常见场景常见工具一、AbstractRoutingDataSource1.1、 定义 DynamicDataSourceHolder1.2、 配置动态数据源1.3、 在Spring配置中定义数据源1.4、在业务代码中切换数据源 二、Dynamic Datasource for Spring Boot2.1. 添加依赖…

Element plus 低版本弹窗组件添加拖拽功能

在使用element plus 弹窗组件el-dialog 的时候,由于自己组件库版本过低,所以就会缺失某些功能,比如弹窗组件的可拖拽功能。因为某些原因element plus 组件库又不能升级,所以此时就需要自己为弹窗组件添加拖拽功能。共分为一下四个…

斯坦福大学李飞飞教授分享:只有计算机和机器人具备空间智能,人工智能的潜力才能得到充分发挥

在最近李飞飞教授的TED演讲中,她深入探讨了空间智能对人工智能(AI)发展的深远影响。 今天,AI的发展也在经历类似的革命性变化。李飞飞教授回顾了计算机视觉的早期进展,介绍了她和团队在ImageNet上的努力,以…

英语学习笔记24——Give me/us/him/her/them some ...

Give me/us/him/her/them some … 给我/我们/他/她/他们一些…… 词汇 Vocabulary desk n. 课桌(有书桌堂),写字台 复数:desks 搭配:desk mate 同桌    构成:desk mate 桌子上的伙伴 同桌    cl…

[Algorithm][动态规划][简单多状态DP问题][买卖股票的最佳时机 III][买卖股票的最佳时机 Ⅳ]详细讲解

目录 1.买卖股票的最佳时机 III1.题目链接2.算法原理详解3.代码实现 2.买卖股票的最佳时机 IV1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机 III 1.题目链接 买卖股票的最佳时机 III 2.算法原理详解 注意:本题为了便于初始化,有较多细节服…

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像“

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像” 问题描述解决方法1.首先从官网下载最基础的ubuntu base核心文件,ubuntu core.2.接下来就是制作一个基础功能的根文件系统3.修改可用源4.接下来就是挂载根文件系统,进行模拟安装应用5.根文件系统安装常用的工具和配置用户…

Polar Si9000 远程桌面提示cannot checkout an uncounted license错误

Polar Si 9000 版本《Si9000e_2022_v22_03》安装完成之后指定到license时候提示如下: cannot checkout an uncounted license 修正办法将安装目录下的license用文档编辑工具(记事本或者Notepad)打开.lic文件,使用编辑器的替换功…

瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置

关注星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 串口是最常见的通信方式之一,也是单片机调试最常见的通信接口,也是现在的单片机必备的通信接口,目前(2024-05)最新、最强…

【香橙派AIpro】开箱测评

1.板子开箱 哟,看起来还不错哦!!! 收货清单: 主板*1 1.5m数据线*1 充电头*1 1.1.充电头 近65W的充电头,不错不错。 1.2.主板 1.2.1.上面 哇噢,还送了2.4/5G的WiFi和蓝牙天线。 emm&#xf…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹,学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间,YOLOv10就来了! 《太卷了,目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

吴恩达2022机器学习专项课程C2W2:2.22 多类 softmax softmax与神经网络 softmax的代码改良 多标签分类

目录 多分类问题1.什么是多分类问题2.多分类问题案例3.二分类与多分类的区别 Softmax1. 什么是Softmax2.逻辑回归预测的计算过程3. Softmax预测的计算过程4.Softmax 回归与逻辑回归的关系5. Softmax的损失函数 softmax与神经网络1.设置Softmax层2.Softmax层的计算3.softmax激活…

卸载/删除 Maxask.com,最简单的方法

被绑架的浏览器,太恶心了。 Maxask伪装成了插件,在你搜索网页的时候利用了重定向,导致出现的界面时Maxask的界面,很恶心。 只需要排查正在使用的,如下图有颜色的图表。 删除一个插件,浏览器搜索一下看看有…

先进制造aps专题九 中国aps行业分析

国外aps的问题是不给国内客户定制算法 国外aps的算法都很强大,考虑几百个约束条件,各种复杂的工序关系,还有副资源约束特殊规格约束,排程还优化,光c写的算法代码就几十万行甚至上百万行 国内aps的问题是实现不了复杂的…