从零开始学习Linux(11)----进程间通信(管道)

1.引言

        两个进程之间,可以进行数据的直接传递吗?不能!进程具有独立性

1.为什么??

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程)
  • 进程控制:有些进程希望完全控制另一个进程的执行(如调试进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

        往往需要多个进程协同,共同完成一些事情

2.是什么

        一个进程把自己的数据,能够交给另一个进程。

3.怎么办??

        a.一般规律

        进程间通信的本质:先让不同的进程,看到同一份资源(一般都是要由OS提供)

  1. 交换数据的空间(内存)
  2. 不能由通信双方任何一个提供!

        b.具体做法

        OS提供的空间有不同的样式,就决定了有不同的通信方式

  1. 管道(匿名,和命名):基于文件的,让不同进程看到同一份资源的通信方式,叫做管道!管道只能被设计成为单向通信
  2. 共享内存
  3. 消息队列
  4. 信号量

2.管道

        管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用(通常是一个父进程和它的子进程)。管道的实质是一个内核缓冲区,进程以先进先出(FIFO)的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据。

        匿名管道:可以(只能)进行具有血缘关系的进程,进行进程间通信

代码测试如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void writer(int wfd)
{const char* str="hello father,I am child";char buffer[128];int cnt=0;pid_t pid=getpid();while(1){snprintf(buffer,sizeof(buffer),"message:%s,pid:%d,count:%d",str,pid,cnt);write(wfd,buffer,strlen(buffer));cnt++;sleep(1);}
}
void reader(int rfd)
{char buffer[1024];while(1){ssize_t n=read(rfd,buffer,sizeof(buffer)-1);(void)n;printf("father get a message %s",buffer);}
}
int main()
{int pipefd[2];int n=pipe(pipefd);if(n<0) return 1;printf("pipefd[0]:%d,pipefd[1]:%d\n",pipefd[0],pipefd[1]);//3,4pid_t id=fork();if(id==0){//child:rclose(pipefd[0]);writer(pipefd[1]);exit(0);}//father:wclose(pipefd[1]);reader(pipefd[0]);wait(NULL);
}

a.4种情况

  1.  管道内部没有数据&&子进程不关闭自己的写端文件fd,读端(父)就要阻塞等待,直到pipe有数据
  2. 管道内部被写满&&父进程(读端)不关闭自己的fd,写端(子)写满之后,就要阻塞等待
  3. 对于写端而言:不写了&&关闭了pipe,读端会将pipe中的数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件的结尾
  4. 读端不读&&关闭,写端在写,OS会直接终止写入的进程(子进程),通过信号13)SIGPIPE 信号杀掉进程

b.5种特性

  1. 自带同步机制
  2. 血缘关系进程进行通信,常见于父子
  3. pipe是面向字节流的
  4. 父子退出,管道自动释放,文件的生命周期是随进程的
  5. 管道只能单向通信,半双工的一种特殊情况

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

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

相关文章

决定佛蒙特州版图的关键历史事件:

​决定佛蒙特州版图的关键历史事件: 1. 早期探险与命名&#xff1a; - 1609年&#xff0c;法国探险家萨缪尔德尚普兰&#xff08;Samuel de Champlain&#xff09;到达了现在的佛蒙特州区域&#xff0c;并探索了尚普兰湖&#xff08;Lake Champlain&#xff09;。他将周围的山…

深入探索Scala的高级类型系统:特性与应用

Scala是一种静态类型编程语言&#xff0c;以其强大的类型系统而著称。Scala的类型系统不仅提供了类型安全&#xff0c;还支持高级编程技术&#xff0c;如模式匹配、高阶函数和泛型编程。本文将深入探讨Scala类型系统的高级特性&#xff0c;包括它们的工作原理、如何使用以及在实…

为Python脚本创建用户友好的图形界面:选择适合你的方法

在Python中创建图形用户界面&#xff08;GUI&#xff09;有多种方法&#xff0c;每种方法都有其独特的优点和适用场景。以下是几种流行且有效的方法&#xff0c;帮助你选择最适合的GUI框架。 PySimpleGUI 易用性&#xff1a;PySimpleGUI通过包装Tkinter、Qt、WxPython和Remi简…

TS_类型

目录 1.类型注解 2.类型检查 3.类型推断 4.类型断言 ①尖括号&#xff08;<>&#xff09;语法 ②as语法 5.数据类型 ①boolean ②number ③string ④undefined 和 null ⑤数组和元组 ⑥枚举 ⑦any 和void ⑧symbol ⑨Function ⑩Object 和 object 6.高…

SpringBoot 与 PageHelper 的正确集成方法,避免常见误区!

在现代Java Web开发中&#xff0c;分页是一个常见且重要的功能。PageHelper作为一个强大的分页插件&#xff0c;能够与MyBatis无缝集成&#xff0c;提供便捷的分页操作。然而&#xff0c;很多开发者在使用SpringBoot集成PageHelper时&#xff0c;常常被网上各种教程误导&#x…

局部 `DataContext`

为了确保的新 ViewModel 不会影响现有绑定到 MainViewModel 的其他属性&#xff0c;可以使用 MonitorPage 作为 UserControl 的局部 DataContext&#xff0c;而不覆盖整个 UserControl 的 DataContext。可以通过在 XAML 中的某个局部范围内&#xff08;如包含时间显示的 TextBl…

ATL新能源科技薪资待遇及Verify测评语言理解数字推理题型简介

一、走进ATL新能源科技 ATL新能源公司&#xff0c;即东莞新能源科技有限公司&#xff0c;是全球领先的可充式锂离子电池研发、生产和营销企业。成立于2004年&#xff0c;总部位于香港&#xff0c;产品广泛应用于消费电子产品和电动汽车领域。ATL以其技术创新和与苹果等大客户的…

Java中的Monad设计模式及其实现

Java中的Monad设计模式及其实现 在函数式编程中&#xff0c;Monad是一种重要的设计模式&#xff0c;用于处理包含隐含计算信息&#xff08;如计算顺序、环境、状态、错误处理等&#xff09;的计算。Monad提供了一种结构&#xff0c;使得可以将计算链式连接起来&#xff0c;每一…

2024年【电工(初级)】考试内容及电工(初级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容参考答案及电工&#xff08;初级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及电工&#xff08;初级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

等保2.0安全计算环境解读

等保2.0&#xff0c;即网络安全等级保护2.0制度&#xff0c;是中国为了适应信息技术的快速发展和安全威胁的新变化而推出的网络安全保护标准。相较于等保1.0&#xff0c;等保2.0更加强调主动防御、动态防御和全面审计&#xff0c;旨在实现对各类信息系统的全面保护。 安全计算环…

如何使用PHP和swoole进行大规模的网络爬虫开发?

如何使用php和swoole进行大规模的网络爬虫开发&#xff1f; 引言&#xff1a; 随着互联网的迅速发展&#xff0c;大数据已经成为当今社会的重要资源之一。为了获取这些宝贵的数据&#xff0c;网络爬虫应运而生。网络爬虫可以自动化地访问互联网上的各种网站&#xff0c;并从中…

Docker基础知识的掌握,相关基本命令的用法

安装docker步骤&#xff1a;https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d 1.docker Docker 是一种容器化平台&#xff0c;用于帮助开发者打包、发布和管理应用程序及其依赖关系。通过 Docker&#xff0c;开发者可以将应用程序及其所有依赖项打包到一个称为…

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法&#xff1f; 需求&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能 短连接风暴 短连接模式&#xff1a;执行很少的 SQL 语句就断开&#xff0c;…

uniapp加载打点点效果

uniapp加载打点点效果 背景实现思路代码实现尾巴 背景 为了增加系统的交互性&#xff0c;我们在加载数据时通常会增加一些loading动效&#xff0c;但是在某些场景下只需要一些简单文字提醒。比如说使用【加载中】或者【loading】等字段&#xff0c;但是写静态的字符又显得交互…

【若依前后端分离】前端vue页面查看服务器本地的PDF

后端实现&#xff1a; 使用FileSystemResource包装文件&#xff0c;以便Spring MVC可以处理该资源 创建HttpHeaders对象以设置响应头 设置Content-Disposition头&#xff0c;使得浏览器以内联方式显示PDF&#xff08;即在浏览器中直接打开&#xff09; 设置Content-Type为appli…

Thinger.io 支持多协议、插件化100%开源 IoT 企业级物联网平台

项目源码&#xff0c;文末联系小编 Thinger.io 是一个开源插件化物联网平台&#xff0c;提供了设备原型、扩展和设备连接管理所需的一切工具。我们的目标是使物联网的使用民主化&#xff0c;使其可供全世界使用&#xff0c;并简化大型物联网项目的开发。 01 Thinger.io 物联网平…

Python学习路线图:120天系统学习,你也能成大神!

学Python&#xff0c;切忌今天这学一点&#xff0c;明天那里学一点&#xff0c;零零散散没有系统的学习。这样不仅耽搁大家时间&#xff0c;久而久之也会消磨大家学习的兴致&#xff01;这里给大家总结了一张系统的Python学习路线图&#xff01;希望大家共勉&#xff01; Pyth…

期末考试结束,成绩如何快速发布?

随着期末考试的落幕&#xff0c;老师们又迎来了一项繁琐的任务将成绩单私信给学生家长。这项工作耗时耗力&#xff0c;而且极易出错&#xff0c;期末老师的工作已经足够繁重还要私发成绩&#xff0c;简直是雪上加霜。 好消息是&#xff0c;现在有了易查分小程序&#xff0c;只需…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级&#xff0c;就要学会进行整理维护电脑 基于小白用户&#xff0c;每一个操作点我都会在后续整理出流程&#xff0c;软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改&#xff0c;也希望有补充告诉我&#xff0c;我…

【Linux详解】进程地址空间

目录 研究背景 验证地址空间 实验一&#xff1a;父子进程变量地址一致性 实验二&#xff1a;变量值修改后父子进程的差异 分析与结论 实验三&#xff1a;进程地址空间验证 理解进程地址空间 区域与页表 写时拷贝机制 进程地址空间的意义 文章手稿&#xff1a; xmind…