【Linux进程通信】匿名管道的常见特性、两进程间通过管道通信的情况分析

news2025/1/18 9:51:08

目录

一、只有血缘关系的进程之间才可以进行管道通信

二、管道只可以单向通信

三、进程间通信是会协同的-同步与互斥的

1.父子进程读写端都正常,管道为空父进程读端阻塞。

2.父子进程读写端都正常,管道满时子进程写端阻塞。

3.子进程写端关闭,父进程读端正常,父进程就会读到0,表明读到了管道文件的末尾,父进程读端不会被阻塞。(一般可利用这种情况间接的终止子进程)

4.子进程写端正常,父进程关闭读端,操作系统就会终止子进程(本质是OS通过发送信号终止掉)

四、管道通信是面向字节流的

五、管道是基于文件的,而文件的生命周期是随进程的


一、只有血缘关系的进程之间才可以进行管道通信

血缘关系如何理解呢?其实就是父进程fork创建了多个子进程,这些子进程之间的关系就是兄弟关系,子进程又创建了子进程,该子进程与第一个父进程就是爷孙关系了等等,一般是父进程和子进程之间进行通信的多。

二、管道只可以单向通信

三、进程间通信是会协同的-同步与互斥的

管道也是有固定大小的,当向管道被写满是则不能再继续向管道里写入内容!

进程间通过管道进行通信(子进程向管道写数据,父进程读数据)的4种情况:

1.父子进程读写端都正常,管道为空父进程读端阻塞。

2.父子进程读写端都正常,管道满时子进程写端阻塞。

3.子进程写端关闭,父进程读端正常,父进程就会读到0,表明读到了管道文件的末尾,父进程读端不会被阻塞。(一般可利用这种情况间接的终止子进程)

如下代码用于测试匿名管道特性1和特性3:

#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>

#define NUM 1024

char array[NUM]={0};
int pipefd[2]={0};
void Writer(int wpipe)
{
    std::string s="hello pipe";
    int cnt =5;
    while(cnt>0)
    {
        array[0]=0;
        snprintf(array, sizeof(array), "%s-%d", s.c_str(), cnt--);//构建向管道发送的字符串
        write(wpipe, array, strlen(array));//向管道写入字符串内容
        sleep(2);
    }
}

void Reader(int rpipe)
{
    while(true)
    {
        array[0]=0;
        ssize_t n = read(rpipe, array, sizeof(array));
        if(n>0)
        {
            array[n]=0;
            std::cout<<"parent get news from pipe is:"<< array <<std::endl;
        }
        else if(0==n)
        break;
    }
}
int main()
{
    int tmp = pipe(pipefd);//父进程创建管道文件
    assert(!tmp);
    pid_t rid = fork();
    if(0 == rid)//child  子进程向管道写内容
    {
        close(pipefd[0]);
        Writer(pipefd[1]);
        exit(0);
    }
    close(pipefd[1]);//parent
    Reader(pipefd[0]);
    return 0;
}

9baaa4a121ed4eb7a21e8db9a831df9d.gif 

4.子进程写端正常,父进程关闭读端,操作系统就会终止子进程(本质是OS通过发送信号终止掉)

四、管道通信是面向字节流的

可以简单的理解为:读取管道内容是通过单位字节一个一个读取的。

五、管道是基于文件的,而文件的生命周期是随进程的

由于管道在被进程创建打开时,OS会为管道文件创建struct file结构体,每个打开管道的进程的文件描述符表都有指向该管道内核结构体的struct file*类型指针,当打开该管道文件的进程终止或进程通过close(文件描述符)关闭了该管道文件时,管道文件的内核结构体struct file内部的count就会计数减一,当0==count时,操作系统就会自动释放管道的内核结构体。

 

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

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

相关文章

idea集成uglifycss压缩混淆css

Uglifycss介绍 https://www.npmjs.com/package/uglifycss 命令行 $ uglifycss [options] [filename] [...] > output 选项&#xff1a; --max-line-len n每个字符添加一个换行符&#xff08;大约&#xff09;; 表示无换行符&#xff0c;并且是默认值n0 --expand-vars扩…

计算机组成原理——锁存器和触发器

文章目录 1. SR锁存器 1.1 电路结构 1.2 电路解析 2. 带en输入的SR锁存器 2.1 ​​​​​​​电路结构 2.2 工作原理 3. ​​​​​​​带En输入的D锁存器 3.1 电路结构 3.2 工作原理 4. ​​​​​​​边沿触发的D触发器 4.1 电路结构 4.2 工作原理 1. SR锁存器 …

【Qt知识】window frame 对窗口坐标的影响

在Qt中&#xff0c;窗口框架&#xff08;Window Frame&#xff09;对Widget的尺寸计算和坐标定位有着直接的影响&#xff0c;这主要是因为窗口框架本身占据了一定的空间&#xff0c;包括标题栏、最小化/最大化/关闭按钮以及边框。这部分额外的空间在不同的应用场景下需要被考虑…

Tomcat服务部署、优化及多实例实验

一、Tomcat基础 1.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;Tomcat虽然和Apache或者Nginx这些Web服务器一样&#xff0c;具有处理HTML页面的功能&#xff0c;然而由于其处理静态HTML的能力远不及Apache或者Nginx&#xff0c;所以Tomcat通常…

Geeker-Admin:现代化的开源后台管理框架

Geeker-Admin&#xff1a;优雅管理&#xff0c;高效开发&#xff0c;尽在Geeker-Admin- 精选真开源&#xff0c;释放新价值。 概览 Geeker-Admin是一个基于Vue 3.4、TypeScript、Vite 5、Pinia和Element-Plus构建的开源后台管理框架。它为开发者提供了一套现代化、响应式的管理…

设计NOR Flash(FMSC接口)的Flashloader(MCU: stm32f4)

目录 概述 1 硬件 1.1 MCU和S29GL128P10TFI01控制电路 1.1.1 S29GL128P10TFI01 1.1.2 MCU与NOR Flash接口 1.2 STM32F4的FSMC接口 1.2.1 时序信号 1.2.2 外部存储器接口信号 2 Flash leader功能实现 2.1 框架结构介绍 2.2 S29GL128P10TFI01的Flash leader框架 2.3 N…

Camera Raw:编辑 - 混色器

Camera Raw “编辑”模块中的混色器 Color Mixer面板用于调整图像中的颜色&#xff0c;通过控制色相、饱和度和明亮度&#xff0c;可以对特定颜色进行微调&#xff0c;优化图像的色彩表现。 面板分为“混色器”和“点颜色”两个模式。 ◆ ◆ ◆ 使用方法与技巧 1、查看要调整…

【机器学习】Python zip 函数

目录&#xff1a; 什么是zip函数zip的基本使用zip与列表、字典的结合zip的长度匹配规则实际应用 1. 什么是zip函数 zip函数在Python中用于将多个可迭代对象&#xff08;如列表、元组、字符串等&#xff09;打包成一个元组的列表&#xff0c;其中每个元组包含的是原始对象中的…

邀请函 | 极限科技全新搜索引擎 INFINI Pizza 亮相 2024 可信数据库发展大会!

过去一年&#xff0c;在全球 AI 浪潮和国家数据局成立的推动下&#xff0c;数据库产业变革不断、热闹非凡。2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;“2024 可信数据库发展大会” 将于 2024 年 7 月 16-17 日在北京悠唐皇冠…

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式&#xff0c;它们之间有几个主要区别&#xff1a; 1. **构建工具&#xff1a;** …

WIFI模组ESP-12F 规格书分享

一、 产品概述 ESP-12F 是由安信可科技开发的 Wi-Fi 模块&#xff0c;该模块核心处理器 ESP8266 在较小尺 寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU&#xff0c;带有 16 位精 简模式&#xff0c;主频支持 80 MHz 和 160 MHz&#xff0c;支持 RTOS&…

【PB案例学习笔记】-25制作一个带底图的MDI窗口

写在前面 这是PB案例学习笔记系列文章的第25篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

什么是未授权访问漏洞?Hadoop Redis靶场实战——Vulfocus服务攻防

什么是未授权访问漏洞&#xff1f;Hadoop & Redis靶场实战——Vulfocus服务攻防 一、介绍 未授权访问&#xff0c;也称为未经授权的访问或非法访问&#xff0c;是指在没有得到适当权限或授权的情况下&#xff0c;个人或系统访问了网络、计算机、数据库、文件、应用程序或…

C语言 | Leetcode C语言题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {char key;char val;UT_hash_handle hh; };bool isIsomorphic(char* s, char* t) {struct HashTable* s2t NULL;struct HashTable* t2s NULL;int len strlen(s);for (int i 0; i < len; i) {char x s[i], y t[i]…

DETR End-to-End Object Detection with Transformers

End-to-End Object Detection with Transformers 论文链接&#xff1a;http://arxiv.org/abs/2005.12872 代码地址&#xff1a;https://github.com/facebookresearch/detr 一、摘要 提出了一种将目标检测视为直接集合预测问题的新方法。该方法简化了检测流程&#xff0c;有效…

【TB作品】20以内加减法训练机,ATMEGA128单片机,Proteus仿真

题目 7 &#xff1a;玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴&#xff0c;能够实现弹奏和音符显示功 能。 具有 8 个音阶按键&#xff0c;每按下一个按键时&#xff0c;所对应的 LED 点亮&#xff0c;音符进行显示。 具体要求如下&#xff1a; &…

微积分-导数3(微分法则)

常见函数的导数 常量函数的导数 d d x ( c ) 0 \frac{d}{dx}(c) 0 dxd​(c)0 常量函数的图像是一条水平线 y c y c yc&#xff0c;它的斜率为0&#xff0c;所以我们必须有 f ′ ( x ) 0 f(x) 0 f′(x)0。从导数的定义来看&#xff0c;证明也很简单&#xff1a; f ′ …

系统工程与信息系统基础(上)

目录 系统工程 霍尔三维结构的三维&#xff1a; 切克兰德方法&#xff1a; 并行工程方法&#xff1a; 综合集成法&#xff1a; WSR系统方法&#xff1a; 系统工程生命周期阶段 探索性阶段 概念阶段 开发阶段 生产阶段 使用阶段 保障阶段 退役阶段 系统工程生命周…

sky18流水线设计

1.最大时钟频率确定 时钟周期要大于等于组合逻辑的delay&#xff08;最大的那条delay&#xff09; Freq_max(Mhz) 1000/T_delay(ns); 数据吞吐率Throughput Freq_max *Toggle_rate;//Toggle_rate&#xff1a;如两个时钟&#xff0c;输入变一次&#xff0c;就是50%&#xff1b…

业务链SFC简介

目录 业务链&#xff08;SFC&#xff09;简介什么是业务链&#xff1f;业务链的体系架构业务链的基本工作流程PBRPBR实现的SFC工作流程 NSHNSH报文NSH实现的SFC工作流程 区别 业务链的应用 配置指南 业务链&#xff08;SFC&#xff09;简介 业务链是网络功能虚拟化&#xff08…