匿名管道-

news2025/5/16 16:13:53

因为父子进程是共享文件描述符的环形队列,只能读一次 会被后面覆盖

/*
    #include <unistd.h>
    int pipe(int pipefd[2]);
    功能:创建一个匿名管道,用于进程间通信
    参数:int 类型数组 ,是传出参数
        pipefd[0]是管道读端 
        pipefd[2]是管道写端
    返回值:成功 0
            失败 -1
    管道默认是阻塞的,如果管道中没有数据,read阻塞,如果通道满了,write阻塞
    匿名管道只能用于有关系的进程之间的通信(父子进程 兄弟进程)
*/
//子进程发数据给父进程
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
int main() {
    //在fork之前创造管道
    int pipefd[2];
    int ret = pipe(pipefd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    pid_t pid = fork();
    if(pid > 0) {
        printf("parent process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            int len = read(pipefd[0], buf, sizeof(buf));
            printf("parent recv: %s, pid: %d\n", buf, getpid());
            char* str = "hello, i am parent";
            write(pipefd[1], str, strlen(str));
            sleep(1);
        }
        
    }else if(pid == 0) {
        printf("child process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            char* str = "hello, i am child";
            write(pipefd[1], str, strlen(str));
            sleep(1);

            int len = read(pipefd[0], buf, sizeof(buf));
            printf("child recv: %s, pid: %d\n", buf, getpid());
        }
        
    }
    return 0;
}

有可能出现自己写自己读的现象

特点(假设都是阻塞态):

1.所有的指向管道写端的文件描述符都关闭了(管道写端引用计数为0),有进程从管道的读端读数据,那么当管道内部的数据被读取之后,再次read会返回0,就像读到文件末尾一样。

2.如果有指向管道写端的文件描述符没有关闭(管道的写端引用计数大于0)。而持有管道写端的进程也没有往管道中读取数据,这个时候有进程从管道中读取数据,那么管道中剩余的数据被读取后,再次read会堵塞,直到管道中有数据可以读了才读取数据并返回

3. 如果所有的指向管道读端的文件描述符关闭了(管道的读端引用计数0),这个时候向管道中写数据,那么该进程会受到信号SIGPIPE,导致进程异常终止。

4.如果有主席昂管道读端的文件描述符没有关闭(管道的读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时候有进程向管道中写数据,那么在管道被写满的时候再次write会堵塞,直到管道中有空位置。

        

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

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

相关文章

企业级SpringBoot单体项目模板 ——整合MySQL和Mybatis-plus

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Springboot、数据库、Git、项目☀️每日 一言&#xff1a;野心是对梦想最好的致敬&#xff01; 上回我们已经成功的创建了一个SpringBoot的单体项目并测试启动并了&#xff0c;但是光有个空架子是…

【独立全开源】点大商城V2-2.5.2 新增 微信小程序隐私协议弹窗

独立全开源版本&#xff1a;点大商城V2小程序公众号模块&#xff0c;版本更新至2.5.2&#xff0c;前端为UNiapp、这个是源码后端开源&#xff0c;购买包更新&#xff0c;包修复、 更新为覆盖升级&#xff0c;源码更新了&#xff1a;新增 微信小程序隐私协议弹窗 测试环境&…

肖sir__mysql之多表练习题__007

已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09; 1&#xff1a;dept表中有4条…

C++ Primer 第4章 表达式

C Primer 第4章 表达式 4.1 基础4.1.1 基本概念一、组合运算符和运算对象二、运算对象转换三、重载运算符四、左值和右值 4.1.2 优先级与结合律一、括号无视优先级与结合律二、优先级与结合律有何影响 4.1.3 求值顺序一、求值顺序、优先级、结合律 4.2 算术运算符练习 4.3 逻辑…

图片拖动验证效果(源码)

JS案例图片拖动验证 &#x1f31f;效果展示 &#x1f31f;前置知识 CSS sprite 精灵图 &#x1f31f; 代码实现 页面搭建 距离计算 逻辑部分 随机生成背景图片 计算拖动图块和空缺图块的位置 绑定事件 &#x1f31f;写在最后 &#x1f31f;效果展示 &#x1f31f;…

六、不root不magisk不xposed lsposed frida原生修改定位

前言常用风控APP检测1.Aida64检测2.momo检测3.微霸检测4.cellular-z检测 厂商测试总结 前言 不root不戴面具 不xposed lsposed frida&#xff0c;不分身&#xff0c;不多开&#xff0c;最完美的原生修改定位。 常用风控APP检测 先看效果再说原理&#xff0c;先过一遍环境 1.Ai…

mysql内连接与外连接详解

内连接与外连接 内连接外连接 在数据库中&#xff0c;连接操作是一种把两个或者多个表的记录组合在一起的操作&#xff0c;常用的有内连接&#xff08;Inner Join&#xff09;、外连接&#xff08;Outer Join&#xff09;等。 内连接 内连接&#xff08;Inner Join&#xff0…

STM32 Cubemx 通用定时器 General-Purpose Timers同步

文章目录 前言简介cubemx配置 前言 持续学习stm32中… 简介 通用定时器是一个16位的计数器&#xff0c;支持向上up、向下down与中心对称up-down三种模式。可以用于测量信号脉宽&#xff08;输入捕捉&#xff09;&#xff0c;输出一定的波形&#xff08;比较输出与PWM输出&am…

mysql 日志总结

mysql 根据日志的功能&#xff0c;分6种 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time 的所有查询&#xff0c;方便我们对查询进行优化通用查询日志&#xff1a;记录所有连接的起始时间和终止时间&#xff0c;以及连接发送给数据库服务器的所有指令&#xff0…

Junit单元测试异常处理方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Junit单元测试异常处理方法 前言案例准备一、类方法内处理异常二、测试方法中处理异常1.try/catch/finally 语句2.Test(expected)3.ExpectedException 前言 提示&#xff1a…

【C语言】指针和数组笔试题解析(2)

【C语言】指针和数组笔试题解析&#xff08;1&#xff09;&#xff0c; 这是第一篇关于sizeof与strlen在指针中的应用&#xff0c;而这一篇主要讲解在各种情形下的灵活运用&#xff0c;也是大厂中经典的面试题 第一题&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };in…

开始在 Windows 上使用 Next.js

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 必备条件 安装 Next.js 本指南帮助你安装 Next.js Web 框架并在 Windows 上启动和运行。 Next.js 是一个框架&…

利用idea新创建maven项目时的一些基本配置

1.修改项目默认的maven仓库 file->Settings->Build 2.设置项目的jdk版本 设置完点OK即可。 同样的我们还需要在项目配置中进行修改。 通过以上设置一般就可以解决jdk版本不兼容地方问题。

详细解释HiveSQL执行计划

一、前言 Hive SQL的执行计划描述SQL实际执行的整体轮廓&#xff0c;通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑&#xff0c;掌握了执行逻辑也就能更好地把握程序出现的瓶颈点&#xff0c;从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其…

Redis 高性能设计之epoll和IO多路复用深度解析

I/O多路复用模型是什么 I/O&#xff1a;网络I/O多路&#xff1a;多个客户端连接&#xff08;连接就是套接字描述符&#xff0c;即socket或者channel&#xff09;&#xff0c;指的是多条TCP连接复用&#xff1a;用一个进程来处理多条的连接&#xff0c;使用单进程就能的够实现同…

【Linux系统编程】操作系统的概念、定位 及系统调用

文章目录 前言1. 操作系统的概念和定位2. 如何理解“管理”3. 操作系统为什么要做管理4. 系统调用和库函数概念5. 局部性原理6. 计算机体系结构 前言 上一篇文章我们学习了冯诺依曼体系结构&#xff08;属于计算机硬件的范畴&#xff09;&#xff0c;其中我们提到&#xff0c;因…

c++静态成员变量与静态成员函数

一、静态成员变量 1、说明 1.1、所有对象共享同一份静态变量 1.2、编译阶段分配内存 1.3、类内声明&#xff0c;类外初始化操作 静态成员变量&#xff0c;不属于某个具体的类对象&#xff0c;多有的类对象共享同一份数据 因此静态成员变量有两种方式访问 2、…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式&#xff1f;3、为什么要开启 Hive 模式&#xff1f;4、有什么副作用&#xff1f;5、如何开启 Hive 兼容模式&#xff1f;6、该场景下&#xff0c;能不能不开启 Hive 兼容模式&#xff1f;7、为什么不是DATE_FORMAT(datetime, string)&…

【小记录】jupyter notebook新版本

手欠升级 &#x1f605;今天手贱&#xff0c;在anaconda navigator里面更新了最新版本的spyder&#xff0c;然后莫名奇妙地jupyter notebook就打不开了&#x1f605;&#xff0c;报错说缺少模块”ModuleNotFoundError: No module named jupyter_server.contents“&#xff0c;…

给微信小程序添加隐私协议

前些日子&#xff0c;微信官方针对用户的安全信息又进行了增强&#xff0c;这次更新几乎要求所有的小程序都需要进行整改&#xff0c;只要是涉及到用户的隐私的小程序都需要进行整改&#xff0c;这次整改是强制性的。 点开相关指引之后会跳转到下面的链接&#xff1a;参考链接…