Linux -- 进程间通信、初识匿名管道
目录
进程间通信
什么是进程间通信
进程间通信的一般规律
前言:
管道
代码预准备:
如何创建管道 -- pipe 函数
参数:
返回值:
wait 函数
参数:
验证管道的运行:
源文件 test.c :
makefile 文件:
运行结果:
进程间通信
什么是进程间通信
进程间通信(Inter-Process Communication, IPC)是操作系统中非常重要的一个概念,它指的是不同进程之间进行数据交换或者传递消息的机制。
进程间通信的主要原因和目的是:
资源共享:不同的进程可能需要访问相同的资源或数据,例如文件、数据库等。通过IPC,可以实现对这些共享资源的有效管理和同步访问。
任务协作:在很多情况下,一个复杂的任务可能被分解为多个子任务,由不同的进程来执行。为了完成整个任务,这些进程之间需要相互通信,以协调它们的工作流程。
提高效率:对于一些计算密集型的任务,可以通过将工作分配给多个进程来并行处理,从而加速任务的完成。这时就需要有效的通信机制来保证各部分工作的正确性与一致性。
模块化设计:软件开发时采用模块化的设计思想,即将程序划分为相对独立但又能相互作用的功能单元(即进程)。这样做不仅有利于维护,而且也使得系统更加灵活可扩展。良好的IPC支持能够促进这种架构模式的应用。
跨网络服务调用:随着分布式系统的普及,在不同主机上的进程也需要能够互相通信。这涉及到更高级别的IPC形式,如RPC (Remote Procedure Call) 等技术。
进程间通信的一般规律
让不同的进程看到同一份资源!!!
前言:
假设现在有A、B进程,在A进程中开辟一块空间并写入数据,让 B 进程去 A 进程的这块空间读取数据,虽然确实让不同的进程看到了同一份资源,但是破坏了进程的独立性。
所以进程间通信需要有交换数据的空间,且这块空间不能由通信双方任何一个提供,那么这块空间只能由操作系统提供。
我们回顾一下父子进程,假设父进程对同一个文件分别用读方式和写方式打开,父进程将会得到两个文件描述符对象。
为什么对同一个文件分别用读方式打开和写方式打开,会创建两个文件描述符对象?
当你使用读取模式(例如 open("file.txt", "r")
)和写入模式(例如 open("file.txt", "w")
)分别打开同一个文件时,操作系统会为每次打开操作分配一个独立的文件描述符。这样做有几个原因:
独立性:每个文件描述符代表了对文件的一个独立访问路径。这意味着你可以同时从一个文件描述符读取数据,而从另一个文件描述符写入数据,即使它们指向的是同一个物理文件。这种独立性允许更灵活地处理文件。
位置指针:每个文件描述符都有自己的文件偏移量或位置指针。当你通过不同的文件描述符读写文件时,每个描述符的位置指针可以独立移动。这样,在进行多线程或多进程操作时,各个进程/线程可以安全地在不同位置上工作而不互相干扰。
权限控制:以不同模式打开文件提供了对文件的不同级别的访问权限。比如,只读模式下你只能读取文件内容,而在写入模式下还可以修改文件。拥有两个文件描述符意味着可以根据需要选择适当的访问级别,同时也增加了安全性,因为不需要给所有操作都赋予完全相同的权限。
性能与资源管理:尽管是同一份文件,但根据具体的操作需求(如顺序读取、随机写入等),操作系统可能采取不同的策略来优化I/O性能。此外,维护多个文件描述符也便于系统更好地跟踪哪些程序正在使用该文件,并且有助于实现诸如引用计数这样的机制,从而有效地管理文件相关的系统资源。
总之,虽然这两个文件描述符对应于同一物理文件,但是它们各自保持了自己的状态信息,这使得在同一时间内能够执行更加复杂的并发操作,同时也增强了系统的灵活性和安全性。
父进程得到两个文件描述符对象之后,我们创建子进程,子进程继承父进程的文件描述符表,父子进程指向同一个文件和缓冲区!这也就实现了父子进程看到同一份资源,就可以实现进程间通信!
管道
从前言中就可以看出,管道的本质是文件!
在 Linux 中,管道(pipe)是一种进程间通信(IPC, Inter-Process Communication)的机制,它允许一个进程的输出直接作为另一个进程的输入。
管道可以看作是连接两个或多个命令的数据流通道,它使得数据可以在不同的程序之间流动而不需要通过临时文件。
标准的管道是单向的,即数据只能从写端流向读端。
匿名管道:
在前言中,父进程和子进程的文件的读端和写端都是打开的,为了符合管道是单向的,我们可以选择让 父进程作为写端,子进程作为读端 或者 父进程作为读端、子进程作为写端!
如下图,我们让父进程作为写端,子进程作为读端:
代码预准备:
如何创建管道 -- pipe 函数
#include <unistd.h>int pipe(int pipefd[2]);
该函数用于创建一个匿名管道。
参数:
pipefd
:这是一个指向两个整数的指针。pipe()
成功后,这两个整数会被设置为新创建的管道的读端和写端的文件描述符。读端通常为fd[0]
,写端通常为fd[1]
。
返回值:
- 它在成功时返回 0,并且通过其参数(一个包含两个整数的数组)来传递两个文件描述符;
- 如果调用失败,
pipe()
会返回-1,并设置全局变量errno
来指示具体的错误原因。
wait 函数
#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);
wait()
函数是 Unix 和 Linux 系统中用于进程控制的一个重要函数。它允许一个进程(通常是父进程)等待其子进程结束,并获取子进程的退出状态。wait()
函数会阻塞调用者,直到至少有一个子进程终止或接收到一个信号。
参数:
status
:这是一个指向整数的指针,用来存储子进程的退出状态信息。如果不需要这个信息,可以传递NULL
。
返回值:
- 如果有子进程成功终止,则返回该子进程的 PID;
- 如果没有子进程或者所有子进程都还在运行,
wait()
将一直阻塞,直到至少有一个子进程终止。- 如果发生错误(如被信号中断),则返回-1,并设置
errno
。
验证管道的运行:
源文件 test.c :
#include<stdio.h>
#include<stdlib.h>
#include<string.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();//获得进程pidwhile(1){//向缓冲区里写入内容snprintf(buffer,sizeof(buffer),"message:%s,pid:%d,count:%d\n",str,pid,cnt);//把缓冲区里的内容写入到管道write(wfd,buffer,sizeof(buffer));cnt++;sleep(1);}
}void reader(int rfd)
{char buffer[128];while(1){//读取管道里的内容ssize_t n=read(rfd,buffer,sizeof(buffer)-1);printf("father get a message: %s",buffer);}
}int main()
{int pipefd[2];int n=pipe(pipefd);if(n<0){return 1;}printf("%d %d\n",pipefd[0],pipefd[1]);pid_t id=fork();if(id==0){//子进程创建成功//关闭读端close(pipefd[0]);writer(pipefd[1]);//写exit(0);}//父进程关闭写端close(pipefd[1]);reader(pipefd[0]);//读wait(NULL);return 0;
}
makefile 文件:
testpipe:test.cgcc -o $@ $^.PHONY:clean
clean:rm -f testpipe
运行结果:
从下面的运行结果可以看出,父进程接收到了子进程写的数据:
相关文章:

Linux -- 进程间通信、初识匿名管道
目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言: 管道 代码预准备: 如何创建管道 -- pipe 函数 参数: 返回值: wait 函数 参数: 验证管道的运行: 源文件 test.c : m…...

网站的SSL证书快到期了怎么办?怎么续签?
网站的SSL证书即将到期时,需要续签一个新的证书以保持网站的安全性和信任度。以下是续签SSL证书的一般步骤: 1. 选择证书提供商 如果您之前使用的是免费证书,您可以选择继续使用同一提供商的免费证书服务进行续签。如果您需要更高级别的证书…...
解決爬蟲代理連接的方法
爬蟲在運行過程中常常會遇到代理連接的問題,這可能導致數據抓取的效率降低甚至失敗。 常見的代理連接問題 代理IP失效:這是最常見的問題之一。有些代理IP可能在使用一段時間後失效,導致連接失敗。 連接超時:由於網路不穩定或代…...

Prometheus 监控Harbor
你好!今天分享的是基于Prometheus监控harbor服务。 在之前的文章中分别介绍了harbor基于离线安装的高可用汲取设计和部署。那么,如果我们的harbor服务主机或者harbor服务及组件出现异常,我们该如何快速处理呢? Harbor v2.2及以上…...

SQL 干货 | SQL 半连接
大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi …...
洛谷 P1226:【模板】快速幂
【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a,b,p,求 a^b mod p。【输入格式】 输入只有一行三个整数,分别代表 a,b,p。【输出格式】 输出一行一个字符串 a^b mod ps&a…...
nginx常规操作
Linux下查找Nginx配置文件位置 1、查看Nginx进程 ps -aux | grep nginx 圈出的就是Nginx的二进制文件 2、测试Nginx配置文件 /usr/sbin/nginx -t 可以看到nginx配置文件位置 3、nginx的使用(启动、重启、关闭) 首先利用配置文件启动nginx。 nginx -c /usr/local/nginx/conf…...

Docker镜像不能访问
Get "https://registry-1.docker.io/v2/": dial tcp 192.168.10.194:443: connect: connection refused Idea推送镜像至Harbor私服,报以上错误,Docker镜像地址不能访问,更新Harbor服务器Docker镜像地址,重启Docker服务…...

TCP simultaneous open测试
源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…...
Spring 配置文件动态读取pom.xml中的属性
需求: 配置文件中的 spring.profiles.active${env}需要打包时动态绑定。 一、方案: 在pom.xml文件中配置启用占位符替换 <profiles><!-- 本地开发 --><profile><id>dev</id><properties><env>dev</env>…...

Konva 组,层级
代码: <template><div class"rect"><div class"header"> <!-- <el-button type"primary" click"show">展示</el-button>--> <!-- <el-button type"success&quo…...

vue图片加载失败的图片
1.vue图片加载失败的图片 这个问题发生在测试环境和开发本地,线上环境是可以的,测试环境估计被第三方屏蔽了 2.图片有,却加载不出来 <template v-slot:imageUrlsSlots"{ row }"><div class"flexRow rowCenter"&…...

终止,半成收入来自海外,收入可持续性被质疑
芬尼科技终止原因如下:芬尼科技4年期间经历了两次IPO失败,公司半成收入来自海外,然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者:Eric 来源:IPO魔女 9月25日&a…...

日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入
目前的需求是数据库字段固定,而excel的字段不固定,需要实现excel导入到一个数据库内。 首先是前端的字段匹配,显示数据库字段和表头字段 读取表头字段: 我这里实现的是监听器导入,需要新建一个listen类。 读Excel …...

Unable to open nested entry ‘********.jar‘ 问题解决
今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…...

反编译华为-研究功耗联网监控日志
摘要 待机功耗中联网目前已知的盲点:App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测(若灭屏30分钟内则周期1分钟,否则为2分钟),检…...
线程池——Java
一、前言 在字符串常量池中,字符串常量在java程序运行之前就已经创建好了,等程序运行起来后,就可以直接从常量池中拿到字符串并加载到内存中,这样的设计就省下了字符串的构造与销毁的内存开销。 二、优势 操作系统由内核与应用程…...
java 17天 TreeSet以及Collections
SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点:有序 唯一 实现类:TreeSet 利用TreeSet特有的对数据进行升序,再放到ArryList进行for下标倒序打印,或者利用自身的pollLast()取出最后元…...
JavaScript 第27章:构建工具与自动化
在现代JavaScript开发中,构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用,并给出一些示例。 1. 构建工具ÿ…...
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题 最近手里一台乐视的手机root后, 连接wifi时一直提示网络连接受限,wifi图标显示叹号. 但是不影响正常的网络访问. 解决办法: adb shell settings delete global captive_portal_modeadb shell settings put globa…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...