Linux:进程间通信之命名管道

news2024/9/25 14:17:20

Linux:进程间通信-CSDN博客

我们说匿名管道只能用于父子进程这样的关系通信,那么陌生进程怎么通信?

我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct,从而通过文件的inode映射同一份文件来通信;而陌生的进程他们怎么看见同一份文件?

通过文件内核缓冲区

什么叫文件内核缓冲区?

来先看看一个朴素的通信:

一个进程把数据写到磁盘上的一个文件,另一个进程从磁盘中读取来完成通信

但是每次我们都要把文件从磁盘加载出来,很慢,所以我们理想的情况是这个中间文件,如果放到内存里(而不是磁盘),然后两个需要通信的进程一个从里面读,另一个从里面写,最后不用把数据刷新到磁盘里(因为是临时数据,无意义),这样就可以最大效益化的通信了

那么这两个文件怎么找到这个中间文件?

通过路径+文件名的方案

所以这个文件就要具备两个特点:

1.当该文件被打开时,不会被刷新在磁盘上,而是在内存中作为数据被临时保存

2.但是在磁盘层面上要有自己的文件名和路径,方便进程锁定

符合这两个条件的文件就是命名管道

利用命名管道进行进程间通信

命名管道的创建:mkfifo

第一个参数:创建的文件名,第二个参数:创建的管道的权限(管道也是一种文件)

成功返回0,失败返回-1

我们来写一下用命名管道来实现两个陌生进程的通信:

        大体逻辑是实现一个客户端和用户端的通信

comm.h:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>        
#include <sys/stat.h>
#include <fcntl.h>
#define MY_FIFO "./fifo"

server:


#include "comm.h"
int main(){
    umask(0);//防止设置权限时受umask影响
    //if(mkfifo(MY_FIFO,0666)<0){//创建管道文件
    //    perror("mkfifo");
    //    return 1;
    //}
    //printf("start");
    int fd=open(MY_FIFO,O_RDONLY);//打开文件
    if(fd<0){
        perror("open error");
    }
    //让我们的server提供读服务
    while(1){
        char buffer[1024]={0};
        ssize_t s=read(fd,buffer,sizeof(buffer)-1);
        if(s>0){
            buffer[s]=0;
            printf("client say:");//读取结束
            printf("%s",buffer);
            //break;
        }else if(s==0){
             printf("Client disconnected...\n");
            break;
            break;
        }else{
            perror("read error");//处理error
        }

    }
    close(fd);    
}

client.c:

#include"comm.h"//client和server都包含fifo文件,上图可以通信
int main(){
    //printf("start");
    int fd=open(MY_FIFO,O_WRONLY);
    if (fd<0){
        perror("open error");
        return 1;
    }
    
    while(1){
        printf("请输入:");
        fflush(stdout);//刷新缓冲区
        char buffer[64]={0};
        ssize_t s=read(0,buffer,sizeof(buffer)-1);
        if(s>0){
            buffer[s]=0;
            printf("%s\n",buffer);
            write(fd,buffer,strlen(buffer));
        }
    }
    close(fd);
    return 1;
}

实现结果:

这两个进程,我们要先执行./server/.exe来生成我们的命名管道文件fifo:

再执行./client.exe,用client端来操作server端

我们来验证一下命名管道到底会不会从磁盘加载内容:

./client.exe:

./server.exe:

会先卡在这里没有反应,卡多久呢?

因为是sleep(10)当然是10s了

所以如果你一次性输入很多内容到命名管道文件里,但是server并没有读取,一般来讲数据只能在管道文件里,可是我们发现管道文件的大小是0。这说明命名管道的数据为了效率,不会刷新到磁盘 ,等一会就会刷新

为什么之前的pipe叫匿名管道,这样子通信叫命名管道?

因为这个管道文件有名字啊!有名字有路径,大家是陌生的进程也可以看见同一份命名管道文件;而匿名管道靠的是父子间进程的继承,才实现的通信

好了就说到这里吧。。。放一张和兔兔的合照

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

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

相关文章

c++反汇编逆向还原指令jge jg jle jl jne je

c反汇编逆向还原jge jg jle jl jne je所还原的c代码 c反汇编逆向还原&#xff0c;if语句、赋值、算数|逻辑运算符(> 、>、、<、<、if中的&&、!、||) 在汇编指令中 jge 前面>后面 jg 前面>后面 jle 前面<后面 jl 前面<后面 jne 前面不等…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

酒店智能插座有什么用途

作为提升住宿体验的关键一环&#xff0c;酒店智能插座正以其独特的功能和便捷性&#xff0c;悄然改变着旅客的居住体验。本文将深入探讨酒店智能插座的多种用途。 一、能源管理与节能减排 酒店智能插座首要的功能之一在于其强大的能源管理能力。通过内置的传感器和智能算法&…

低成本搭建企业专属云电脑 贝锐向日葵推出私有化云电脑服务

作为一种硬件虚拟化技术&#xff0c;云电脑的优势是十分显著的&#xff0c;比如可以随时随地访问&#xff0c;拥有较高的性能、无需我们购买昂贵的实体硬件、计算资源可以按需灵活拓展等等。 如今&#xff0c;越来越多的企业也开始认识到云电脑所带来的优势&#xff0c;将云电…

软考(9.22)

1 在浏览器的地址栏中输入xxxyftp.abc.can.cn&#xff0c;在该URL中( )是要访问的主机名。 A.xxxyftp B.abc C.can D.cn 协议://主机名.域名.域名后缀或IP地址(:端口号)/目录/文件名。 本题xxxyftp是主机名&#xff0c;选择A选项。 2 假设磁盘块与缓冲区大小相同&#xff0c;…

DAMODEL丹摩智算平台实践CogVideoX

文章目录 前言 一、平台账号注册并登录 二、部署CogVideoX &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 1. 创建实例 2. 配置环境和依赖 3.预制模型与配置文件 三、开始运行 总结 前言 该文章主要记录DAMODEL丹摩智算平台实践过程与心得体会&…

【自动化测试】Appium Server如何安装和Appium Server安装困难的原因和解决方法以及常见的一些安装失败的错误和解决方法

引言 Appium Server安装过程时常出现问题&#xff0c;以下是安装Appium Server过程一些原因、常见错误和解决方法 文章目录 引言一、Appium Server如何安装1.1 Node.js 安装1.2 使用NPM安装Appium1.3 验证Appium安装1.4 运行Appium Server1.5 使用Appium Desktop&#xff08;可…

QT C++ 自学积累 『非技术文』

QT C 自学积累 『非技术文』 最近一段时间参与了一个 QT 项目的开发&#xff0c;使用的是 C 语法&#xff0c;很遗憾的是我之前从来没有接触过 C &#xff0c;大学没有开过这堂课&#xff0c;也没用自己学习过&#xff0c;所有说上手贼慢&#xff0c;到现在为止其实也不是很清楚…

经纬恒润全冗余R-EPS助力L4级自动驾驶落地

随着L4级别自动驾驶技术的逐步成熟与商业化进程加速&#xff0c;行业对车辆安全性的要求达到了新的高度。为了确保自动驾驶车辆全天候、全路况下安全运行&#xff0c;冗余系统的研发与应用成为关键。在这一背景下&#xff0c;经纬恒润开发了齿条式全冗余电动助力转向系统R-EPS&…

Spring Boot 进阶- Spring Boot入门程序详解

在上篇文章中,我们创建了一个RESTFul风格的接口项目,并且分析了它的相关依赖,这里我们就来看一下这个项目还有什么值得我们分析的地方。前面提到的,在SpringBoot的场景启动器中,我们提供了一些自动配置的功能,那么在之前我们也说过,这些自动配置,除了可以自动配置之外,…

基于springboot在线点餐系统

基于springbootvue实现的点餐系统 &#xff08;源码L文ppt&#xff09;4-077 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入点餐系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者和管理者,一般使用…

【C++】stack和queue的使用及模拟实现

stack就是栈的意思&#xff0c;这个结构遵循后进先出(LIFO)的原则&#xff0c;可以将栈想象为一个子弹夹&#xff0c;先进去的子弹后出来。 queue就是队列的意思&#xff0c;这个结构遵循先进先出(FIFO)的原则&#xff0c;可以将对列想象成我们排队买饭的场景&#xff0c;先排…

Java Web应用升级故障案例解析

在一次Java Web应用程序的优化升级过程中&#xff0c;从Tomcat 7.0.109版本升级至8.5.93版本后&#xff0c;尽管在预发布环境中验证无误&#xff0c;但在灰度环境中却发现了一个令人困惑的问题&#xff1a;新日志记录神秘“失踪”。本文深入探讨了这一问题的排查与解决过程&…

一份在阿里内网悄悄流传的大模型面试真题!(2024年最新)

随着人工智能技术的迅猛发展&#xff0c;计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;、搜索、推荐、广告推送和风险控制等领域的岗位越来越受欢迎&#xff0c;而对于大型模型技术的掌握成为了这些岗位的标配。 但目前公开的大模型资源还是…

FAT32取证分析

前言&#xff1a; 在正常工作中经常会有数据恢复或者取证分析的场景&#xff0c;数据是否能被恢复&#xff0c;主要还是看数据是否被覆盖&#xff0c;正常情况下文件虽然被删除&#xff0c;只是修对应的标志位&#xff0c;文件本身数据并不会被破坏&#xff0c;所以我们就可以…

Chrome截取网页全屏

1.使用Chrome开发者工具 Chrome自带的开发者工具&#xff0c;可以进行网页整页截图&#xff0c; 首先打开你想截图的网页&#xff0c; 然后按下 F12,调出开发者工具&#xff0c; 接着按Ctrl Shift P。 紧接着输入指令 capture&#xff0c; 它会提示有三个选项&#xff0c;如…

应用层 IV(万维网WWW)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、WWW 的概念与组成结构 1. 万维网的概念 万维网 WWW&#xff08;World Wide Web&#xff09;并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息…

echarts y轴滚动(react版本)

目录 效果图如下&#xff0c;代码见下方 代码可以直接复制&#xff0c;图片和css也要复制 tsx代码 css代码 代码里用到的图片&#xff0c;可以换成自己项目的图 效果图如下&#xff0c;代码见下方 代码可以直接复制&#xff0c;图片和css也要复制 tsx代码 import React,…

Leetcode 1396. 设计地铁系统

1.题目基本信息 1.1.题目描述 地铁系统跟踪不同车站之间的乘客出行时间&#xff0c;并使用这一数据来计算从一站到另一站的平均时间。 实现 UndergroundSystem 类&#xff1a; void checkIn(int id, string stationName, int t) 通行卡 ID 等于 id 的乘客&#xff0c;在时间…

自动化测试常用函数:元素定位、操作与窗口管理

目录 一、元素的定位 1. cssSelector 2. xpath 2.1 获取HTML页面所有的节点 2.2 获取HTML页面指定的节点 2.3 获取一个节点中的直接子节点 2.4 获取一个节点的父节点 2.5 实现节点属性的匹配 2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对象 1. 点击/提交…