系统编程-管道

管道

目录

管道

1、管道的特点

2、无名管道的使用步骤

(1)在进程中使用 pipe 函数来获取管道的文件描述符

(2)使用 fork 函数来创建子进程

(3)通过获取到的文件描述符来进行数据的传输

(4)当管道不再使用的时候 需要进行关闭

3、有名管道的使用步骤

(1)创建一个有名管道出来

(2)打开有名管道 (有名管道的使用方式)

(3)通过打开的有名管道进行数据的操作

(4)关闭有名管道

4、删除有名管道函数

使用有名管道实现双向通信,用两根管道


引入:

  • 信号可以实现进程间的交互 但是没法发送数据。

  • 管道可以实现数据的传输

  • linux 下一切都是文件,管道也是一种文件 我们可以通过文件操作来进行数据的传输

-- 什么是进程间通信?

        每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

1、管道的特点

-- 1 先进先出

  • 数据被一个进程读出后,将被从管道中删除,其他读进程将不能再读到这些数据。管道的内容读完后不会保存。

-- 2 单向

  • 数据的流通方向的单向的,一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。

-- 3 管道为空

  • 无法读出数据 会读阻塞(进程试图读空管道时,进程将阻塞)

-- 4 管道为满

  • 写堵塞(管道已经满时,进程再试图向管道写入数据,进程将阻塞。)

  • 管道大小 64KB

alt text

alt text

  • 直接将1024这一块区域写进文件,并没有对该地址的空间做出改变,所以是可以的。

-- 5 管道有两种

  • 无名管道
    -- 没有名字的管道 只能让亲缘(父子)进程使用

  • 有名管道
    -- 在同一个操作系统下 用任意的两个进程都可以使用

-- 6 管道是单向的,一边要么读,一边要么写,不可以又读又写,想要一边读一边写,那就创建2个管道

-- 当进程退出之时,管道也随之释放,与文件保持一致


2、无名管道的使用步骤

(1)在进程中使用 pipe 函数来获取管道的文件描述符

-- 函数头文件

  • #include <unistd.h>

-- 函数的原型

  • int pipe(int pipefd[2]);

-- 函数的作用:

  • 调用该函数可以创建一个无名管道用于父子进程间通信
  • !!!该函数需要在 fork 之前来调用否则会创建两根管道

-- 函数的参数

  • 函数的参数用于返回无名管道的读端口和写端口对应的文件描述符
  • int pipefd[2]:一个 int 类型的数组
  • pipefd[0] 对应读端口
  • pipefd[1] 对应写端口

-- 函数的返回值:

  • 成功返回:0
  • 失败返回:-1
(2)使用 fork 函数来创建子进程
  • pid_t fork(void);
(3)通过获取到的文件描述符来进行数据的传输

-- 因为我们获取的是文件描述符,所以可以直接使用 read 和 write 函数来进行数据的写入和读取

  • ssize_t read(int fd, void *buf, size_t count)
  • ssize_t write(int fd, const void *buf, size_t count)

注:任何的数据传输,接收方接收的数据类型尽量的要跟发送方的一致

alt text

alt text

alt text

(4)当管道不再使用的时候 需要进行关闭

-- 调用 close 函数即可

  • 1 写端口彻底关闭 但是管道中还有数据 读端口可以正常读取 数据读取完毕之后 管道自动关闭
  • 2 读端口彻底关闭 写端口不可以正常写入

alt text

  • 要想彻底关闭管道,需要父子进程都进行 close 操作
    父进程关闭读写端口,子进程关闭读写端口 

    alt text


-- 向管道中写数据,从管道中读数据

alt text

alt text


3、有名管道的使用步骤

-- 因为无名管道使用范围有限(只能在父子进程之间),为了让任意的两个进程都可以使用管道通信,我们就可以用有名管道.

-- 有名管道的特点跟无名管道无区别

(1)创建一个有名管道出来

-- 使用指令创建

alt text

-- 使用函数创建

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/stat.h>

-- 函数原型

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

-- 函数的作用:

  • 根据参数来创建一个有名管道文件

-- 函数的参数:

  • pathname:路径和文件名
  • mode:有名管道的文件权限

-- 函数的返回值:

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

alt text

(2)打开有名管道 (有名管道的使用方式)
  • 使用 open 函数来对有名管道进行打开
  • 有名管道必须要让两个进程同时调用 open 函数才可以打开成功
  • 而且一个进程以只读的方式 一个进程以只写的方式
  • 要想打开有名管道 必须要凑够可读可写这两个权限
(3)通过打开的有名管道进行数据的操作
  • read 和 write 函数来进行数据的写入和读取
  • ssize_t read(int fd, void *buf, size_t count)
  • ssize_t write(int fd, const void *buf, size_t count)
  • 任何的数据传输,接收方接收的数据类型尽量的要跟发送方的一致
(4)关闭有名管道
  • 读端先关闭 写端无法使用
  • 写端先关闭 但是管道中有数据 读端口仍可进行读取

4、删除有名管道函数

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • int unlink(const char *pathname)

-- 函数的作用

  • 删除有名管道文件

-- 函数的参数:

  • pathname:填写有名管道文件

-- 函数的返回值:

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

使用有名管道实现双向通信,用两根管道

alt text

alt text

alt text

-- rr.c

#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "unistd.h"
int main(int argc,char*argv[])
{if(argc<3){printf("格式输入有误!\n");return -1;}char buff1[30]={0};char buff2[30]={0};pid_t pid = fork();if(pid == 0){while(1){//sleep(1);int fd_r = open(argv[1],O_RDONLY);int ret = read(fd_r,buff1,30);if(ret>0){printf("接收到%d个字节\n",ret);printf("buff1:%s\n",buff1);}else {break;}memset(buff1,0,30);close(fd_r);}}else if(pid >0){while(1){int fd_w = open(argv[2],O_WRONLY);scanf("%s",buff2);write(fd_w,buff2,strlen(buff2));perror("write");close(fd_w);}}return 0;
}

-- ww.c

#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "unistd.h"
#include <string.h>int main(int argc,char*argv[])
{if(argc<3){printf("格式输入有误!\n");return -1;}char buff1[30] ={0};char buff2[30]={0};pid_t pid =fork();if(pid == 0){while(1){int fd_w = open(argv[1],O_WRONLY);scanf("%s",buff1);write(fd_w,buff1,strlen(buff1));perror("write");close(fd_w);}}else if(pid > 0){while(1){int fd_r = open(argv[2],O_RDONLY);//sleep(2);int ret = read(fd_r,buff2,30);if(ret>0){printf("接收到%d个字节\n",ret);printf("buff2:%s\n",buff2);}else {break;}memset(buff2,0,30);close(fd_r);}}return 0;
}

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

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

相关文章

[论文阅读] mobile aloha实验部分

DP:[1] CHI C, FENG S, DU Y, et al. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion[J]. 2023. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion精读笔记&#xff08;一&#xff09;-CSDN博客 哥伦比亚大学突破性的方法- Diffusio…

【SpringBoot】11 多数据源(MyBatis:dynamic-datasource)

介绍 多数据源&#xff1a;指的是一个单一应用程序中涉及了两个及以上的数据库&#xff0c;这种配置允许应用程序根据业务需求灵活地管理和操作不同的数据库。 需求 一个应用服务中&#xff0c;连接多个数据库&#xff0c;有本地的也有远程的&#xff0c;有MysQL、Oracle、P…

PDPS软件 那智机器人 (丰田版)离线程序导出处理

在PDPS仿真软件中导出的那智机器人离线程序&#xff0c;一般是无法直接给TFD控制装置-那智机器人&#xff08;丰田式样版&#xff09;导入及识别使用。因此要对导出的程序进行转换编译处理&#xff0c;才能给TFD那智机器人&#xff08;丰田式样版&#xff09;导入离线程序。以下…

react antd TreeSelect实现自定义标签

<ProFormTreeSelectlabel"接收对象"name"receiverObjects"colProps{{ span: 16 }}labelCol{{span: 6,}}wrapperCol{{span: 18,}}rules{[{ required: true }]}fieldProps{{showSearch: true,multiple: true,// autoClearSearchValue: true,filterTreeNod…

NASA:北极辐射-冰桥海冰实验(ARISE)2014年原地云数据产品

ARISE_Cloud_AircraftInSitu_C130_Data 简介 ARISE_Cloud_AircraftInSitu_C130_Data_1是北极辐射-冰桥海冰实验&#xff08;ARISE&#xff09;2014年原地云数据产品。该产品是位于华盛顿的美国宇航局科学任务局地球科学部辐射科学、冰冻层科学和机载科学计划共同努力的成果。…

基于单片机的一氧化碳报警系统的设计与实现

摘 要&#xff1a; 一氧化碳对人体有害&#xff0c;尤其超标时会影响人们的健康 。 因此文章设计了一款基于单片机的一氧化氮报警器设计。 论文通过传感器检测一氧化碳浓度&#xff0c;经过 AD 转换&#xff0c;再把检测信号传递给单片机&#xff0c;经过分析处理&#xff0c…

论文辅助笔记:Large Language Models are Zero-Shot Next LocationPredictors

论文理论部分&#xff1a;论文笔记&#xff1a;lunLarge Language Models are Zero-Shot Next LocationPredictors-CSDN博客 2 Data 2.1 Dataset类 2.2 下载文件 2.3 get_dataset 2.4 get_trajectories trajectory_split暂时略去 # save the test dictionary and the true l…

redis核心数据结构源码分析

dictEntry和redisObject 在 Redis 的实现中&#xff0c;当一个键值对被创建并存储时&#xff0c;键通常是一个字符串&#xff0c;而值则是一个 redisObject。因此&#xff0c;在 dictEntry 结构中&#xff0c;key 成员指向的是一个字符串&#xff0c;而 v.val 成员则指向一个 …

45.5【C语言】typedef

目录&#xff1a; *全称 *格式 一般指针 数组指针 函数指针 *细节 *全称 type define 类型&#xff08;重新&#xff09;定义&#xff08;或命名&#xff09;&#xff0c;可简化输入 *格式 1.非指针类型: typedef 类型 简化名称 typedef signed long long k; signed long …

搭建自己的金融数据源和量化分析平台(七):定时更新上市公司所属行业门类及大类

0x00 前言 由于此前从深交所下载的股票信息中只有行业门类信息&#xff0c;没有行业大类信息&#xff0c;导致后续解析三大报表和量化选股的时候无法进行&#xff1a; 可以看到深交所的股票是没有大类信息的。 再看看上交所的保险股&#xff1a; 因此需要将深交所股票的所属…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

【MySQL】 黑马 MySQL进阶 笔记

文章目录 存储引擎MySQL的体系结构存储引擎概念存储引擎特点InnoDBMyISAMMemory 存储引擎选择 索引概述结构B Tree(多路平衡查找树)B TreeHash为什么InnoDB存储引擎选择使用Btree索引结构? 分类思考题 语法SQL性能分析&#xff08;索引相关&#xff09;SQL执行频率慢查询日志p…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

Unity 波函数坍缩算法随机地图生成

Unity 波函数坍缩算法随机地图生成 波函数波函数基本概念位置空间波函数动量空间波函数两种波函数之间的关系波函数的本征值和本征态波函数坍缩 熵是什么熵作为状态函数时间之箭 实现原理举个例子&#xff1a;2D迷宫地图生成 Unity 如何实现前期准备单元格代码瓦片地图代码波函…

通过建模走出人工智能寒冬

很多人对 GenAI 是否会产生商业影响持怀疑态度&#xff0c;但我认为他们不仅错了&#xff0c;而且犯了 2001 年人们在互联网上犯下的错误。他们认为硅谷的炒作是无稽之谈&#xff0c;因此其背后的想法也是无稽之谈。 这是很危险的&#xff0c;我认为&#xff0c;这比大多数零售…

nacos 使用 docker 单机部署连接 MySQL 数据库并开启鉴权

文章目录 本地部署的配置启用鉴权(未验证) docker部署的配置修改docker 镜像源启用鉴权&#xff0c;必须添加如下环境变量如何生成鉴权的密钥 完整环境变量docker启动命令 本地部署的配置 文件结构 application.properties #配置文件 mysql-schema.sql …

WPS关闭后,进程依然在后台运行的解决办法

问题 wps启动后 在启动wps后&#xff0c;什么都不做&#xff0c;打开进程管理器&#xff0c;发现居然运行了3个wps进程&#xff1a; win10只会显示wps进程&#xff1a; win11显示比较准确&#xff1a; 关闭后 在关闭wps&#xff0c;再去任务管理器查看&#xff0c;发现在…

Python计算机视觉 第3章-图像到图像的映射

Python计算机视觉 第3章-图像到图像的映射 3.1 单应性变换 单应性变换&#xff08;Homography&#xff09;是计算机视觉中非常重要的一种几何变换&#xff0c;它用于将一个平面内的点映射到另一个平面内。具体来说&#xff0c;单应性变换可以描述一个图像在摄像机视角变化、…

vue3+vite+axios+mock从接口获取模拟数据实战

文章目录 一、安装相关组件二、在vite.config.js中配置vite-plugin-mock插件三、实现mock服务四、调用api接口请求mock数据方法一、直接使用axios 请求mock 数据方法二、对axios进行封装统一请求mock数据 五、实际运行效果 在用Vue.js开发前端应用时通常要与后端服务进行交互&a…

白酒与家庭聚会:温馨与和谐的时光

在繁忙的都市生活中&#xff0c;家庭聚会是每个人心中那份较温暖的港湾。每当夜幕降临&#xff0c;灯火通明&#xff0c;家人们围坐在一起&#xff0c;谈笑风生&#xff0c;那份温馨与和谐仿佛能够驱散一切疲惫。而在这个温馨的时刻&#xff0c;白酒——豪迈白酒&#xff08;HO…