LINUX---进程间通信(IPC)

news2024/12/28 5:12:31

目录

  • 进程间通信(IPC)介绍:
    • 一、管道
      • 1、特点:
      • 2、原型:
      • 父子进程中的管道应用:
  • FIFO
    • 1、特点
    • 2、原型
  • 三、消息队列
    • ftok
    • 移除消息队列
  • 四.共享内存
  • 信号
    • 信号携带消息
  • 信号量

微信QQ聊天就是进程间通信(基于网络的)
本章学习的都是基于单机的。
[参考文件](link

进程间通信(IPC)介绍:

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

以Linux中的C语言编程为例。

一、管道

管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。

无名管道,不以文件的形式存在于磁盘中。只存在内存中

1、特点:

1.它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

2.它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

3.它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中(不存在磁盘中,也就是父子进程退出后,他就没了)。
4.管道中的数据读走就没了

2、原型:

1 #include <unistd.h>
2 int pipe(int fd[2]);    // 返回值:若成功返回0,失败返回-1

当一个管道建立时,它会创建两个文件描述符:
fd[0]为读而打开,fd[1]为写而打开。如下图:

在这里插入图片描述
读管道里的内容:read ( fd[0], , )
往管道里写内容:write (fd[1], , )
要关闭管道只需将这两个文件描述符关闭即可。

父子进程中的管道应用:


#include<stdio.h>
#include<unistd.h>

int main()
{
    int fd[2];  // 两个文件描述符
    pid_t pid;
    char buff[20];

    if(pipe(fd) < 0)  // 创建管道
        printf("Create Pipe Error!\n");

    if((pid = fork()) < 0)  // 创建子进程
        printf("Fork Error!\n");
    else if(pid > 0)  // 父进程
    {
        close(fd[0]); // 关闭读端
        write(fd[1], "hello world\n", 12);
    }
    else
    {
        close(fd[1]); // 关闭写端
        read(fd[0], buff, 20);
        printf("%s", buff);
    }

    return 0;
}
数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程

记住写时关读,读时关写就行

FIFO

FIFO,也称为命名管道,它是一种文件类型。

1、特点

FIFO可以在无关的进程之间交换数据,与无名管道不同。

FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

2、原型

1.#include <sys/stat.h>
2 // 返回值:成功返回0,出错返回-1
3 int mkfifo(const char *pathname, mode_t mode);
其中的 mode 参数与open函数中的 mode 相同。
一旦创建了一个 FIFO,就可以用一般的文件I/O函数操作它。

在这里插入图片描述
在这里插入图片描述

三、消息队列

原理:B把消息放到消息队列里,A去读。读完之后消息还在
每个消息队列都是一个链表,都有自己的ID
1.获取队列
2.读/写

在这里插入图片描述

1 #include <sys/msg.h>
2 // 创建或打开消息队列:成功返回队列ID,失败返回-1
3 int msgget(key_t key, int flag);
4 // 添加消息:成功返回0,失败返回-1
5 int msgsnd(int msqid, const void *ptr, size_t size, int flag);
6 // 读取消息:成功返回消息数据的长度,失败返回-1
7 int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
8 // 控制消息队列:成功返回0,失败返回-1
9 int msgctl(int msqid, int cmd, struct msqid_ds *buf);

发送:
在这里插入图片描述

接收:
在这里插入图片描述

ftok

ls-i 查询文件索引节点号
引入ftok:
在这里插入图片描述

移除消息队列

msgctl(msgID,IPC_RMID,NULL);

四.共享内存

1 #include <sys/shm.h>
2 // 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
3 int shmget(key_t key, size_t size, int flag);
4 // 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
5 void *shmat(int shm_id, const void *addr, int flag);
6 // 断开与共享内存的连接:成功返回0,失败返回-1
7 int shmdt(void *addr); 
8 // 控制共享内存的相关信息:成功返回0,失败返回-1
9 int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

注意:
共享内存的大小size必须以兆为单位
映射就是把共享内存挂载到进程的存储空间(内存),然后定义一个变量指向这个内存。

写:
在这里插入图片描述
读:
在这里插入图片描述

信号

kill-l 查询信号在这里插入图片描述

发信号:kill(pid,signum)

捕捉信号对信号进行装配,用signal函数
在这里插入图片描述
在这里插入图片描述
发信号:
在这里插入图片描述

信号携带消息

信号量

Linux 下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。

#include <sys/sem.h>
// 创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);
// 对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);
// 控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);

原理:
一个人想进屋子需要拿锁,拿完之后没有锁了,后面的人不能进去。需要等之前的锁放回来,再拿才能进去

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

大数据技术之Hadoop(MapReduce)

第1章 MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个H…

StructuredStreaming Sink

StructuredStreaming Sink Output Modes append 默认追加模式, 将新的数据输出&#xff0c;只支持简单查询 complete 完整模式&#xff0c;支持聚合和排序 update 更新模式&#xff0c;支持聚合不支持排序&#xff0c;没有聚合和append一样 下面这段操作&#xff0c;有聚合…

Python机器学习数据建模与分析——Numpy和Pandas综合应用案例:空气质量监测数据的预处理和基本分析

本篇文章主要以北京市空气质量监测数据为例子&#xff0c;聚集数据建模中的数据预处理和基本分析环节&#xff0c;说明Numpy和Pandas的数据读取、数据分组、数据重编码、分类汇总等数据加工处理功能。同时在实现案例的过程中对用到的Numpy和Pandas相关函数进行讲解。 文章目录数…

新的一年即将到来,分享2023年火爆的行业和值得做的副业兼职项目

明天就是除夕啦&#xff0c;小编还在努力工作着&#xff0c;分享完这一篇文章后&#xff0c;小编也要和家人朋友们一起好好休息下&#xff0c;过一个乐此不疲的春节。今天分享的主要是对明年行业的憧憬以及一些值得做的副业兼职项目&#xff0c;文章比较长&#xff0c;如果觉得…

Spring源码学习:setter循环依赖

1.案例&#xff1a;Component public class A {private B b;Autowiredpublic void setB(B b) {this.b b;}public B getB() {return b;}public void f(){System.out.println(b);} }Component public class B {private A a;Autowiredpublic void setA(A a) {this.a a;}public v…

Ubuntu 终端美化(oh-my-zsh)

文章目录Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09;一、 环境准备二、 配置文件1、 主题2、 修改插件2.1 官方插件2.2 第三方插件Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09; 一、 环境准备 这个美化教程适合于大多数的 Linux 系统&#xff0c;其实可以通用的。…

递归和分治(基础)

目录 一、递归的定义 1、什么时候会用到递归的方法 1. 定义是递归的 2. 数据结构是递归的 3. 问题的解法是递归的 2、应用递归的原则 3、递归调用顺序问题 1. 首先递归的过程可以总结为以下几点&#xff1a; 2. 递归工作栈 二、 递归和非递归的转化 1. 单向递归可…

【JavaGuide面试总结】计算机网络·下

【JavaGuide面试总结】计算机网络下1.HTTP 和 HTTPS 有什么区别&#xff1f;2.HTTP 1.0 和 HTTP 1.1 有什么区别&#xff1f;连接方式状态响应码缓存处理Host头处理带宽优化3.HTTP 是不保存状态的协议, 如何保存用户状态?4.简单说说 ARP 协议的工作原理同一局域网内的 MAC 寻址…

【Java寒假打卡】JavaWeb-ServletContext

【Java寒假打卡】JavaWeb-ServletContext概述域对象ServletContext的配置方式ServletContext的常用方法ServletContext共享数据的方法概述 ServletContext是应用上下文对象&#xff08;应用域对象&#xff09;。每一个应用中只有一个ServletContext对象作用&#xff1a;可以配…

kubernetes集群搭建问题记录

centos7 系统 内核需要升级 centos7内核升级文章 init-config.yaml文件初始化master的时候 advertiseAddress 是主机的ip地址 kubeadm kubelet kubectl 安装 1.19.0 版本&#xff0c;版本高了有问题 yum install -y kubeadm-1.19.0 kubelet-1.19.0 kubectl-1.19.0 master 和…

<Python的字典>——《Python》

目录 1. 字典 1.1 字典是什么 1.2 创建字典 1.3 查找 key 1.4 新增/修改元素 1.5 删除元素 1.6 遍历字典元素 1.7 取出所有 key 和 value 1.8 合法的 key 类型 1. 字典 1.1 字典是什么 字典是一种存储 键值对 的结构. 键值对是计算机/生活中一个非常广泛使用的概念…

【C++算法图解专栏】一篇文章带你掌握前缀和算法(一维+二维)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们一起交流~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/Newin…

Leetcode.1824 最少侧跳次数

题目链接 Leetcode.1824 最少侧跳次数 题目描述 给你一个长度为 n的 3 跑道道路 &#xff0c;它总共包含 n 1个 点 &#xff0c;编号为 0 到 n 。一只青蛙从 0 号点第二条跑道 出发 &#xff0c;它想要跳到点 n处。然而道路上可能有一些障碍。 给你一个长度为 n 1的数组 ob…

ESP32设备驱动-DHT22数字温度湿度传感器驱动

DHT22数字温度湿度传感器驱动 1、DHT22介绍 DHT22电容式湿度传感数字温湿度模块是一款包含复合已校准数字信号输出的温湿度传感器。 应用了专用的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。 该传感器包括一个电容式传感器湿元件和一个高精…

Word2Vec与文章相似度

2.7 Word2Vec与文章相似度 学习目标 目标 知道文章向量计算方式了解Word2Vec模型原理知道文章相似度计算方式应用 应用Spark完成文章相似度计算 2.7.1 文章相似度 在我们的某项目推荐中有很多地方需要推荐相似文章&#xff0c;包括首页频道可以推荐相似的文章&#xff0c;详情…

详解Map和Set

目录 一、二叉搜索树 1、概述 2、模拟实现搜索二叉树 a、向搜索二叉树中插入数据 b、查找二叉搜索树的指定值的结点 c、删除二叉树的指定值的结点 3、对二叉搜索树进行性能分析 二、Map的使用 1、Map简介 2、Map常用方法 ​编辑三、Set的使用 1、Set简介 2、S…

零基础学习笔记 - ADF4159

目录1.准备工作1.1.前言1.2.资料1.3.介绍1.4.应用1.5.应用电路2.ADF41592.1.功能框图2.2.通信协议时序2.2.寄存器2.2.0.注意2.2.1.延迟寄存器(R7)映射2.2.2.步进寄存器(R6)映射2.2.3.偏差寄存器(R5)映射2.2.4.时钟寄存器(R4)映射2.2.5.功能寄存器(R3)映射2.2.6.R分频器寄存器(R…

Batchsize的大小怎样设置?Batchsize过大和过小有什么影响

一、Batchsize基本介绍 1. Batchsize是什么 batch_size:表示单次传递给程序用以训练的数据(样本)个数。如果我们的数据集钟含有的样本总数为12800个样本,batch_size=128,那么就需要10个batch才能够训练完一个epoch。 batch_size一般取值为2的N次幂的形式,这是因为CPU或…

高级性能测试系列《38.Arrivals Thread Group、ConcurrencyThread Group、终极线程组》

一、面向目标&#xff1a;Arrivals Thread Group需求&#xff1a;要做一个秒杀&#xff0c; 能支持1000个人同时秒杀&#xff0c;我们的系统不能崩溃。错误案例示范1秒内的人数的运行是有先后的&#xff0c;1000个人在1秒钟内启动&#xff0c;运行完毕一次就停掉了。由图可以看…

Cadence PCB仿真使用Allegro PCB SI查看仿真波形的方法图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,拓扑提取阶段仿真方法3,图纸设计阶段仿真方法4,总结1,概述 本文简单介绍使用Alegro PCB SI执行仿真查看仿真波形的两种方法。 2,拓扑提取阶段仿真方法 如下图在拓扑提取阶段,添加完激励…