IPC

1.什么是IPC?Inter Process Communication

2.进程间通信常用的几种方式

        1,管道通信:有名管道,无名管道

        2,信号- 系统开销小

        3,消息队列-内核的链表

        4,信号量-计数器

        5,共享内存

        6,内存映射

        7,套接字

无名管道

管道的概念

1.本质

内核缓冲区

伪文件-不占用磁盘空间

2特点:

两部分: 读端,写端,对应两个文件描述符

数据写端流入,读端流出

操作管理的进程被销毁之后,管道自动被释放

管道默认是阻塞的

管道的原理

1.内部实现方式:

队列-环形队列

特点:先进先出

2.缓冲区大小

默认4K,大小会根据实际情况做适当调整

管道的局限性

1.队列: 数据只能读取一次,不能重复读取

2.半双工:

单工:遥控器

半双工:对讲机

创建匿名管道

int pipe(int fd[2])

fd‐传出参数:

        fd[0]‐读端

        fd[1]‐写端

返回值:

        0:成功

        ‐1:创建失败

父子进程使用管道通信

实现 ps aux | grep "bash"

数据重定向:dup2

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");printf("fd[0] is %d\n",fd[0]);printf("fd[1] is %d\n",fd[1]);close(fd[0]);close(fd[1]);return 0;
}
~         

注012是标准输入输出和报错

       int dup2(int oldfd, int newfd);//新段指向旧端

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid;int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");pid = fork();if(pid == -1){printf("fork failed\n");exit(1);}if(pid > 0){close(fd[0]);dup2(fd[1],STDOUT_FILENO);execlp("ps","ps","aux",NULL);perror("excelp");exit(1);}else if (pid == 0){close(fd[1]);dup2(fd[0],STDIN_FILENO);execlp("grep","grep","bash","--color=auto",NULL);}return 0;
}

单个进程也可以使用管道
父子进程在使用管道的时候,父进程写的时候要关闭读,子进程读的时候要关闭写 

管道的读写行为

1.读操作

        1)有数据:read(fd[0]) 正常读,返回读出的字节数

        2)无数据:

                写端被全部关闭,read返回0,相当于读文件到了尾部

                没有全部关闭,read阻塞

2.写操作

        1)读端全部关闭:

                管道破裂,进程被终止

                内核给当前进程发送信号SIGPIPE-13,默认处理动作

        2)读端没全部关闭:

                缓冲区写满了,write阻塞

                缓冲区没满,write继续写,直到写满,阻塞

3.如何设置非阻塞?

1)默认读写两端都阻塞

2)设置读端为非阻塞pipe(fd):

        fcntl-变参函数:复制文件描述符-dup;修改文件属性-open的时候对应flag属性

        设置方法

//获取原来的flags 

int flags = fcntl(fd[0],F+GETFL); 

//设置新的flags 

flag |=O_NONBLOCK; 

fcntl(fd[0],F_SETFL,flags); 

fcntl(fd[0],F_SETFL,flags); 

查看管道缓冲区大小

命令:

ulimit -a

fpathconf

  long fpathconf(int fd, int name);

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");long size = fpathconf(fd[0],_PC_PIPE_BUF);printf("size id %ld\n",size);printf("fd[0] is %d\n",fd[0]);printf("fd[1] is %d\n",fd[1]);close(fd[0]);close(fd[1]);return 0;
}

有名管道

函数形式:int mkfifo(const char \*filename,mode_t mode);

功能:创建管道文件

参数:管道文件文件名,权限,创建的文件权限仍然和umask有关系。

返回值:创建成功返回0,创建失败返回-1。

特点

        有名管道

        在磁盘上有这样一个文件 ls -l ->p

        也是一个伪文件,在磁盘大小永久为0

        数据存在内核中有一个对应的缓冲区

        半双工通信方式

使用场景

没有血缘关系的进程间通信

创建方式

命令:mkfifo 管道名

函数:mkfifo()

 int mkfifo(const char *pathname, mode_t mode);

fifo文件可以使用io函数进程操作

open/close,read/write

不能执行lseek操作

读函数

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int ret;int fd;int nread;char readBuff[50] = {0};ret = mkfifo("/home/u/process/myfifo",0777);if(ret == -1){return -1;}printf("creat file success!\n");fd = open("./myfifo",O_RDONLY);if(fd < 0){return -1;}printf("open file success!\n");nread = read(fd,readBuff,50);printf("read %d byte from fifo :%s\n",nread,readBuff);close(fd);return 0;
}

写程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd;char *str = "hello world!";fd = open("./myfifo",O_WRONLY);if(fd < 0){return -1;}printf("open file success!\n");write(fd,str,strlen(str));close(fd);return 0;
}
~      

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

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

相关文章

【Springboot】Bean解释

在 Spring Boot 中&#xff0c;Bean 就像是你餐厅里的一名员工。比如&#xff0c;你有一名服务员&#xff08;Service&#xff09;、一名厨师&#xff08;Chef&#xff09;和一名收银员&#xff08;Cashier&#xff09;。这些员工都是餐厅正常运转所必需的&#xff0c;他们各自…

axios的post请求,数据为什么要用qs处理?什么时候不用?

为什么使用 qs 处理 POST 数据axios 的 POST 请求默认将 JavaScript 对象序列化为 JSON 格式&#xff08;Content-Type: application/json&#xff09;。但某些后端接口&#xff08;尤其是传统表单提交&#xff09;要求数据以 application/x-www-form-urlencoded 格式传输&…

【unitrix】 4.21 类型级二进制数基本结构体(types.rs)

一、源码 这段代码定义了一个类型级数值系统的 Rust 实现&#xff0c;主要用于在编译时表示和操作各种数值类型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮点值枚举 ///// 特殊浮点值&#xff08;NaN/∞&#x…

UI前端与数字孪生结合实践案例:智慧零售的库存管理优化系统

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生重构零售库存的 “人 - 货 - 场” 协同在零售行业利润率持续承压的背景…

【Freertos实战】零基础制作基于stm32的物联网温湿度检测(教程非常简易)持续更新中.........

本次记录采用Freertos的第二个DIY作品&#xff0c;基于Onenet的物联网温湿度检测系统&#xff0c;此次代码依然是全部开源。通过网盘分享的文件&#xff1a;物联网温湿度检测.rar 链接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取码: qm2e 大家也可以看看…

Matplotlib-多图布局与网格显示

Matplotlib-多图布局与网格显示一、多图布局的核心组件二、基础布局&#xff1a;plt.subplots()快速创建网格1. 均等分网格2. 不等分网格&#xff08;指定比例&#xff09;三、进阶布局&#xff1a;GridSpec实现复杂嵌套1. 跨行列布局2. 嵌套GridSpec四、实用技巧&#xff1a;布…

GitHub上优秀的开源播放器项目介绍及优劣对比

ExoPlayer 项目地址:https://github.com/google/ExoPlayer 特点: 由Google开发,支持广泛的视频格式和流媒体传输协议,如DASH、HLS、SmoothStreaming。 提供灵活的媒体源架构和高级特性,如动态自适应流播放。 开发者可以轻松扩展和定制播放器组件,适应特定需求。 优点: 功…

react打包发到线上报错Minified React error #130

开发过程中遇到一个问题&#xff0c;记录一下 本地打包发布正常&#xff0c;发测试环境正常&#xff0c;可是通过Jenkins打包发布线上报错 报错信息 index-67fbbd81.js:39 Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant130…

微服务项目远程调用时的负载均衡是如何实现的?

负载均衡概述 负载均衡是微服务架构中的核心组件&#xff0c;用于将请求合理分配到多个服务实例上&#xff0c;提高系统的可用性和性能。负载均衡的分类 负载均衡大致可以分为两类 1. 服务端负载均衡 实现位置&#xff1a;独立部署的负载均衡服务器&#xff08;位于客户端和服务…

【中文核心期刊推荐】中国农业科技导报

《中国农业科技导报》是中国科技核心期刊&#xff0c;也是北京大学图书馆“中文核心期刊要目总览”收录的期刊。它是由中国农村技术开发中心主办&#xff0c;全面为科教兴农服务的综合性农业学术期刊。&#xfeff;《中国农业科技导报》是中国农业科学院生物技术研究所承办的&a…

php 如何通过mysqli操作数据库?

在PHP中&#xff0c;mysqli&#xff08;MySQL Improved Extension&#xff09;是操作MySQL数据库的扩展库&#xff0c;提供了面向对象和过程式两种风格。以下是mysqli的基本操作方法&#xff1a; 1. 连接数据库 面向对象风格 $mysqli new mysqli(localhost, username, passwor…

c/c++拷贝函数

memcpy()函数概要原型void * memcpy ( void * dest, const void * src, size_t num );功能memcpy()会复制 src 所指的内存内容的前 num 个字节到 dest所指的内存地址上&#xff08;memcpy()并不关心被复制的数据类型&#xff0c;只是逐字节地进行复制&#xff0c;这给函数的使用…

HTTP核心基础详解(附实战要点)

目录 一图胜千言&#xff1a;HTTP核心机制图解​编辑 一、HTTP本质&#xff1a;通信的桥梁 二、五大核心特性解析 三、HTTP头部&#xff1a;隐藏的控制中心 四、连接管理&#xff1a;性能关键点 开发者必知实践技巧 一图胜千言&#xff1a;HTTP核心机制图解 一、HTTP本质…

华为静态路由配置

问题描述&#xff1a;针对两台笔记本和两个路由器在不同的网段场景中&#xff0c;对两个路由器进行静态路由配置。下面以如下场景为例&#xff0c;介绍详细配置过程。配置步骤&#xff1a; 1、对每个路由器的接口下配置IP地址 [huawei]interface gx/x/x [huawei-interface]ip a…

闲庭信步使用图像验证平台加速FPGA的开发:第八课——图像数据的行缓存

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

经典排序算法

文章目录前言1. 排序的基本概念1.1 排序是什么&#xff1f;1.2 常见的排序算法概览2. 常见排序算法的实现2.1 插入排序 (Insertion Sort)2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 (Shell Sort)2.2 选择排序 (Selection Sort)2.2.1 直接选择排序2.2.2 堆排序 (Heap Sort…

RabbitMQ 消息队列:从入门到Spring Boot实战

RabbitMQ 作为一款开源的、基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议实现的消息代理&#xff0c;凭借其强大的功能、灵活的路由机制以及出色的性能&#xff0c;在业界得到了广泛的应用。无论是处理高并发订单、异步通知、日志收集还是系统解耦&…

代账行业数字化破局:从“知道”到“做到”,三步走稳赢!

认知&#xff01;降本&#xff01;增收&#xff01;数字化&#xff01;——这不仅是口号&#xff0c;更是代账行业在激烈竞争和时代变化中生存发展的关键。很多代账同行其实都明白趋势&#xff0c;也知道大概该怎么做。但问题卡在第一步&#xff1a;不知道怎么开始&#xff0c;…

Mac 电脑crontab执行定时任务【Python 实战】

1、crontab -e 编辑定时任务列表 crontab -e查看当前定时任务列表,长按 i 编辑,编辑完之后按 esc 退出编辑,然后输入:wq 保存并提出。 如下: (base) charles@zl ~ % crontab -e58 15 * * * /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/charle…

go go go 出发咯 - go web开发入门系列(三) 项目基础框架搭建与解读

go go go 出发咯 - go web开发入门系列&#xff08;三&#xff09; 项目基础框架搭建与解读 往期回顾 go go go 出发咯 - go web开发入门系列&#xff08;一&#xff09; helloworldgo go go 出发咯 - go web开发入门系列&#xff08;二&#xff09; Gin 框架实战指南 前言 如…