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 代码实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

完全背包洛谷题单

[USACO08NOV] Buying Hay S 题解:这题看到每个都可以卖出无限多个干草包,就应该想到完全背包,但又不同于普通的完全背包,普通的完全背包是让你通过对应的背包求出最大的价值,但是在这题理解上却是知道能够达到背包容量…

python数据分析——apply 2

参考资料:活用pandas库 1、向量化函数 使用apply时,可以按行或按列应用函数。如果想应用自定义的函数,必须重写它,因为整列或整行传递到了函数的第一个参数中。可以利用向量化函数和装饰器对所有函数进行向量化。对代码进行向量化…

计算机专业必考之计算机指令设计格式

计算机指令设计格式 例题: 1.设相对寻址的转移指令占3个字节,第一字节为操作码,第二,第三字节为相对偏移量, 数据在存储器以低地址为字地址的存放方式。 每当CPU从存储器取出一个字节时候,自动完成&…

uniCloud云存储uni-cdn七牛云扩展存储-开发uniapp项目节约开发成本

为什么要使用uniCloud的扩展存储,那就是省钱,而且DCloud也一直在推uni-cdn,我在项目中也使用七牛云的扩展存储,确实是省钱,如果你的项目使用到大量的图片后者音视频,这些的算计可以帮你省不少钱。下面就通过…

正邦科技(day1)

1:充电桩工作了两个半小时,已用电量13度电(一般的话是一个小时7度电) 2:火线(红色,棕色),零线(蓝色) 3:充电桩工作了两个半小时&#…

H3CNE-8-ARP工作原理

ARP:Address Resolution Protocol 通过目的IP地址请求对方的MAC地址的过程。 数据链路层在进行数据封装时,需要目的MAC地址。 arp -a 查看 arp -d * 清空 主机A发送一个数据包给主机C之前,首先要获取C的MAC地址 数据封装

Reader类的使用方法和技巧,你掌握了吗?

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

Spring Boot 统一数据返回格式

在 Spring Boot 项目中,统一的数据格式返回是一种良好的实践,它提高了代码的可维护性和一致性,并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…

2024年电工杯高校数学建模竞赛(A题) 建模解析| 园区微电网风光储协调优化配置

问题重述及方法概述 问题1:各园区独立运营储能配置方案及其经济性分析 经济性分析采用成本-效益分析方法,计算购电量、弃风弃光电量、总供电成本和单位电量平均供电成本等指标。 问题2:联合园区储能配置方案及其经济性分析 经济性分析采用成…

【链表】Leetcode 92. 反转链表 II【中等】

反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#x…

将 KNX 接入 Home Assistant 之一 准备硬件

不久前有人小伙伴买了usb转knx ,详情请看 一个 usb 转 knx 的模块 然后想通过这个设备接入 Home Assistant。 后来了解了一下 Home Assistant 并不直接支持 usb转KNX的接入&#xff0c;需要通过KNXD插件转接才行。 然而尝试了很多次叶没有成功&#xff0c;使用西门子的usb接口以…

【香橙派AIpro】开箱测评

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

React-入门

React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库 既可以写基于浏览器的应用&#xff0c;还可以写苹果和安卓的原生应用 优势 开发环境搭建 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层是由Webpack构建&#xff0c;封装了配置细…

redis数据类型之string,list

华子目录 key操作说明SCAN cursor [MATCH pattern] [COUNT count]dump与restorekeys 通配符 示例演示 string说明setbit key offset valuegetbit key offsetsetrange key offset value List结构图相关命令lrem key count valueltrim key count value示例&#xff1a;使用 LTRIM…

图形学概述

图形学应用 游戏 游戏的画面好坏如何鉴定呢&#xff1f; 看游戏画面是否够亮&#xff1a;渲染中全局光照的好坏 《只狼》 为什么卡通游戏画面看起来是卡通的呢&#xff1f; 《无主之地3》 这些都是图形学需要着手解决的问题 电影 电影《黑客帝国》的特效也是通过计算机…

Python 全栈体系【四阶】(五十四)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 3. 文字识别技术 3.1 CRNNCTC(2015) CRNN&#xff08;Convolutional Recurrent Neural Network&#xff09;即卷积递归神经网络&#xff0c;是DCNN和RNN的组合&#xff0c;专门用于识别图像中的序列式对象。…

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug&#xff1a; The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …

[笔试强训day09]

文章目录 BC146 添加逗号DP2 跳台阶JZ61 扑克牌顺子解法一&#xff1a;排序模拟解法二&#xff1a;规律哈希 BC146 添加逗号 BC146 添加逗号 #include<iostream> #include<string>using namespace std;int main() {string s;cin>>s;string ans;for(int i0;i…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

揭秘爬虫技术:从请求到存储的全方位解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、爬虫初探&#xff1a;请求与响应 二、数据解析&#xff1a;从混乱中提炼价值 三、数据…