Linux 7种 进程间通信方式

传统进程间通信

        通过文件实现进程间通信 必须人为保证先后顺序        A--->硬盘---> B(B不知道A什么时候把内容传到硬盘中)

1.无名管道

2.有名管道

3.信号

IPC进程间通信

4.消息队列

5.共享内存

6.信号灯集

7.socket通信

一、无名管道(亲缘关系的进程   64K)

原理:

        如果A和B进程想要通过无名管道通信,那就必须在内核空间创建一个无名管道(64K),A和B进程必须是亲缘关系的进程,A进程向管道的一端写数据,B进程可以从管道的另外一端读数据。在A进程和B进程进行数据传输的时候是不允许使用lseek函数的。无名管道是半双工的通信方式。如果A进程一直向管道中写数据写满64K的时候A进程阻塞,直到B进程读一部分数据之后A才能继续写。如果B进程在读数据的时候,无名管道是空的,B进程阻塞。(PS:使用无名管道时,不会创建管道文件,使用有名管道文件,会创建)

API

int pipe(int pipefd[2]);
功能:创建一个无名管道
参数:@pipefd[2]:返回的管道的两端pipefd[1]:写端pipefd[0]:读端
返回值:成功返回0,失败返回-1置位错误码

实例

#include <head.h>
// 子进程从终端读取字符串 通过无名管道 父进程读 然后打印到终端
int main(int argc, const char *argv[])
{int pipefd[2];if (-1 == pipe(pipefd)){perror("pipe error");exit(-1);};char buff[128] = {0};pid_t pid;pid = fork();if (pid == -1){perror("fork error");exit(-1);}else if (pid == 0){// 子进程close(pipefd[0]); // 关闭子进程的读端   因为父子进程同时各自拥有读和写 把对应的关一个while (1){memset(buff, 0, sizeof(buff));fgets(buff, sizeof(buff), stdin); // 从终端读取数据if ((buff[strlen(buff) - 1]) == '\n'){buff[strlen(buff) - 1] = '\0';}write(pipefd[1], buff, sizeof(buff)); // 将读到的写入到管道if (strcmp(buff, "quit") == 0){break;}}close(pipefd[1]);exit(0);}else{// 父进程close(pipefd[1]); // 关闭父进程的写端while (1){memset(buff, 0, sizeof(buff));read(pipefd[0], buff, sizeof(buff)); // 父进程从管道中读printf("父进程data:%s\n", buff);if (strcmp(buff, "quit") == 0){break;}}close(pipefd[2]);wait(NULL);}return 0;
}

结果

二、有名管道(任意进程间的通信    64K)

有名管道可以实现任意进程间的通信,有名管道的大小也是64K,有名管道也是不支持lseek,有名管道也是半双工的通信方式。有名管道创建之后会在用户空间产生一个管道文件(p),这个管

文件是在内存上存储的。如果A和B两个进程想要通过有名管道通信,就打开管道文件,向管道中写向管道中读就可。

API

int mkfifo(const char *pathname, mode_t mode);
功能:创建有名管道
参数:@pathname:有名管道文件的路径及名字@mode: 管道文件的权限(mode & ~umask)
返回值:成功返回0,失败返回-1置位错误码

实例

01mkfifo.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc,const char * argv[])
{//创建管道文件if(mkfifo(FIFO_PATH,0666)==-1){perror("mkfifo error");exit(-1);}//阻塞等待读写getchar();//删除管道文件char buff[128]={0};snprintf(buff,sizeof(buff),"rm -rf %s",FIFO_PATH);system(buff);return 0;
}

02read.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc, const char *argv[])
{int fd;char buff[128] = {0};if (-1 == (fd = open(FIFO_PATH, O_RDONLY))){perror("open error");exit(-1);}while (1){memset(buff, 0, sizeof(buff));read(fd, buff, sizeof(buff));printf("read:[%s]\n", buff);if (strcmp(buff, "quit") == 0){break;}}close(fd);return 0;
}

03write.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc, const char *argv[])
{int fd;char buff[128] = {0};if (-1 == (fd = open(FIFO_PATH, O_WRONLY))){perror("open error");exit(-1);}while (1){memset(buff, 0, sizeof(buff));printf("input:");fgets(buff,sizeof(buff),stdin);if(buff[strlen(buff)-1]=='\n'){buff[strlen(buff)-1]='\0';}write(fd, buff, sizeof(buff));if (strcmp(buff, "quit") == 0){break;}}close(fd);return 0;
}

结果

 三、信号

信号软件层面对中断一种模拟,用户可以给进程发送信号,内核也可以给进程发送信号,进程对信号的响应方式有三种:捕捉,默认,忽略

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

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

相关文章

mysql中in参数过多该如何优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in(1022044,1009786)方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list new ArrayList<>();for (int i 0; i < 3000; i) {list.add(""…

我在高职教STM32——LCD液晶显示(3)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

Matplotlib的原理与使用详解

文章目录 引言Matplotlib 的原理1. 底层结构2. 绘图流程3. 绘图引擎 Matplotlib 的使用1. 基本使用流程2. 自定义图表3. 保存图表 结论 引言 Matplotlib 是一个 Python 的 2D 绘图库&#xff0c;它提供了丰富的绘图接口&#xff0c;使得用户能够轻松创建各种高质量的图表。从简…

利用 Microsoft ChatGPT 和 OPC UA 改变工业格局

在本文中&#xff0c;我们将探讨开放性在工业物联网中的作用&#xff0c;以及Microsoft为创建基于OPC UA的开放平台所做的努力。我们将讨论 Microsoft 开放战略的四大支柱&#xff0c;以及标准化信息模型以实现互操作性的重要性。此外&#xff0c;我们将深入探讨传统接口和数据…

Redis单线程为什么快

首先&#xff0c;需要明确&#xff0c;Redis只有redis-server是单线程的&#xff0c;指所有的命令处理流程在一个线程中处理。 Redis是内存数据库&#xff0c;所有操作都是基于内存的&#xff0c; 不是CPU密集型的。数据结构高效&#xff0c;不同的对象类型有不同的具体实现。…

一键智能整理TXT文档,高效删除连续行,轻松提升工作效率与数据管理效能

信息爆炸的时代&#xff0c;TXT文档作为我们日常工作中不可或缺的一部分&#xff0c;承载着大量的数据和信息。然而&#xff0c;随着文档内容的不断增加&#xff0c;连续重复的行数也逐渐增多&#xff0c;这不仅影响了文档的整洁度&#xff0c;还大大降低了我们处理数据的效率。…

自己本次吃东西的反思:

使用吃东西来应对情绪是一种常见的习惯&#xff0c;但长期来看&#xff0c;可能不是最健康的应对机制。以下是一些建议&#xff0c;帮助你找到更平衡的应对情绪的方法&#xff1a; 1. **意识到习惯**&#xff1a; - 首先&#xff0c;意识到你在不同情绪状态下使用食物作为应对机…

Java集合框架源码分析:HashSet

一、HashSet特性 特性描述是否允许为null允许是否允许数据重复不允许是否有序无序是否线程安全非线程安全 二、HashSet底层实现 HashSet的底层实现是基于HashMap的。构造方法如下&#xff1a; public HashSet() {map new HashMap<>();}public HashSet(int initialCap…

Shell语法全解

Shell基础语法全解 一、shell简介二、shell格式2.1 新建一个shell脚本文件2.2 执行脚本方式 三、变量3.1系统变量3.2自定义变量3.3 特殊变量3.3.1 $n 传入变量3.3.2 $# 输入参数个数3.3.3 $*、$ 输入参数内容3.3.4 $? 上一条命令执行结果 四、运算符 $[]、$(())五、条件判断5.…

Monica

在 《long long ago》中&#xff0c;我论述了on是一个刚出生的孩子的脐带连接在其肚子g上的形象&#xff0c;脐带就是long的字母l和字母n&#xff0c;l表脐带很长&#xff0c;n表脐带曲转冗余和连接之性&#xff0c;on表一&#xff0c;是孩子刚诞生的意思&#xff0c;o是身体&a…

24年下半年各省自考报名时间汇总

24年下半年各省自考报名时间汇总

shell学习笔记

一、Shell概述 Shell是一个命令行解释器&#xff0c;它接收应用程序/用户命令&#xff0c;然后调用操作系统内核 Shell还是一个功能强大的编程语言&#xff0c;易编写、易调试&#xff0c;灵活性强。 Shell程序文件对后置名无要求&#xff0c;一般使用.sh作为后缀 程序书写以#…

【JAVA时间】探索时钟的奥秘

JAVA时间格式&#xff0c;没有那么死板&#xff0c;可以自由组合。你想怎样就怎样&#xff0c;随便你控制。 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter;public class DateFormatEx…

2024年【N1叉车司机】考试及N1叉车司机考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试是安全生产模拟考试一点通总题库中生成的一套N1叉车司机考试题库&#xff0c;安全生产模拟考试一点通上N1叉车司机作业手机同步练习。2024年【N1叉车司机】考试及N1叉车司机考试题库 1、【多选题】《中…

独角兽品牌獭崎酱酒:高性价比的酱香之选

在酱香型白酒领域中&#xff0c;獭崎酱酒以其独特的品牌定位和高性价比迅速崛起&#xff0c;成为市场上备受关注的独角兽品牌。作为贵州茅台镇的一款新秀酱香酒&#xff0c;獭崎酱酒不仅传承了百年酿造工艺&#xff0c;还以创新的商业模式和亲民的价格赢得了广大消费者的青睐。…

BLDC无感控制策略

本文根据 BLDC 的电路模型推导了一个简 化磁链方程来估计转子位置,转速适用范围较 广;重点分析了反电动势和换相电流对转矩脉动 的影响;设计了一种BLDC的无速度传感器高速 驱动控制方案。通过试验验证了新型控制策略 的性能。 1 低速时的转子位置检测 图1 为高速无刷直流电…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

重生奇迹MU 浅析智力妹妹的现状与天赋

早期的重生奇迹MU游戏中&#xff0c;智力系女性角色通常被简称为“奶娘”&#xff0c;因为她们天生就是辅助定位&#xff0c;能够为队友提供很多帮助。那个时代的游戏非常艰难&#xff0c;升级困难&#xff0c;装备和宝石很难获得&#xff0c;使用药品的消耗也非常大。因此&…

Python中的性能分析和优化

在前几篇文章中&#xff0c;我们探讨了Python中的异步编程和并发编程&#xff0c;以及如何结合使用这些技术来提升程序性能。今天&#xff0c;我们将深入探讨如何分析以及优化Python代码的性能&#xff0c;确保应用程序的高效运行&#xff01; 性能分析的基本工具和方法 在进…

AGV机器人的调度开发分析(2)- 内核中的调度

我们开发AGV的调度系统&#xff0c;最重要的是要实现调度的运行&#xff0c;那么调度要执行哪些任务呢&#xff1f; 先来看看德国开发的开源openTCS中的功能定义&#xff1a; openTCS的控制核心是kernel&#xff0c;目的是提供运输系统/工厂的抽象驾驶模型&#xff0c;管理运…