进程通信——匿名管道实现和验证

匿名管道类易语言模块源码 资源介绍:。' 通过类创建回显线程。' 单独运行读管道里自己启动线程。' 匿名管道.运行_匿名管道 (, , , )。' 启动线程 (&显示线程, , )。资源作者:。易语言入门自学。资源界面:。资源下载:。 立即下载

今天我们来分享一下,Linux中关于进程通行中最简单的匿名管道的实现和相关性质的验证。

进程通信的原理是:多个进程看到同一份公共资源(文件),能对该资源进行相应操作,不同进程间即可进行通信。一般有操作系统(内核)提供这一公共资源。今天我们利用匿名管道来实现进程通信。

首先介绍一下,匿名管道的特点:

1.匿名管道只能实现单向通信。

2.匿名管道只能实现有血缘关系的进程之间的通信。

3.管道是一个随进程的文件,即当进程退出时,管道文件不存在。

4.管道的数据通信是基于数或者字节流的通信。

5.管道内部实现同步互斥,满足安全性,保证数据的一致性。

 

接着,举例父子进程的通信来说明匿名管道的通信过程。

A.利用pipe函数建立匿名管道,得到管道的读写文件描述符。

B.fork创建子进程。由于管道的读写文件描述符属于数据,子进程会依照父进程复制一份,即父子同时拥有指向管道文件的读写文件描述符,用有一份公共的管道文件,就拥有了进程通行的条件。

C.由于匿名管道只能实现进程间的单项通信,所以需要手动关闭父子进程冗余的读写端(读写文件描述符)。

注:子写父读,关闭子进程的读端和父进程的写端。需求不同则反之。

D.父子进程进行相应的读写,实现进程通信。

图解如下:

 

我们需要验证以下四种情况:

A.读端不关闭,且不读取管道内容,写端不断向管道写内容,当管道被写满,写端只能阻塞式等待。

部分代码截图和运行结果如下:

 

 

B.写端不关闭,且不向管道写内容,读端不断读取管道内容,当管道中数据读完,读端只能阻塞式等待。

部分代码截图和运行结果如下:

 

 

 

C.读端先于写端关闭,写端收到异常信号退出。

部分代码截图和运行结果如下:

 

 

D.写端先于读端关闭,当读到0时,即读到文件结尾,退出。

部分代码截图和运行结果如下:

 

 

 

实现进程通信——匿名管道,代码如下:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
 
 int main()
 {
      umask(0);
      int pfd[2];
      if(pipe(pfd) < 0){
         perror("pipe wrong!\n");
          exit(1);
      }
  
      pid_t id = fork();
  
      if(id<0){
          perror("wrong!\n");
          exit(1);
      }
 
 	if(id == 0){//child
          close(pfd[0]);
          int i = 0;
          char* tmp = "hello !";
  //      while(1){
 //          i++;
 //          if(i < 5){
 //              printf("child: %s, num: %d\n", tmp, i);
 //              write(pfd[1], tmp, strlen(tmp));
 //          }
 //          else//i>=5
 //          {
 //              exit(1);
 //          }
 
 //      sleep(1);
 //      }
 //      exit(1);
          while(1){
         printf("child: %s, num: %d \n", tmp, i);
         i++;
         if(i>10)return 0;
 	write(pfd[1], tmp, strlen(tmp));
          }
      }
      else{//parent
      int status;
      close(pfd[1]);
      char tmp[1024];
  
      int i=0;
      while(1){
          ssize_t s = read(pfd[0], tmp, sizeof(tmp)-1);
  //      if(i>5) close(pfd[0]);
  //      i++;
          if(s>0){
              tmp[s] = 0;
              printf("parent:%s\n", tmp);
          }
          else if(s == 0){//child quit,so parent will quit
              printf("child quit,so parent will quit!\n");
              sleep(5);
              break;
          }
  //      else{//wrong
  //          printf("read wrong!\n");
  //          int status;
  //          pid_t s = waitpid(id, &status, 0);
  //          if(s>0){
  //       printf("waitpid success! sig:%d, exitCode: %d\n",\
  //              WIFEXITED(status),WEXITSTATUS(status) );
  //              }
  //          exit(2);
  //      }
      }
          if(waitpid(id, &status, 0)>0){
          printf("waitpid success! sig:%d, exitCode: %d\n",\
          WIFEXITED(status),WEXITSTATUS(status) );
          }
      }
      return 0;
  }


分享如上,欢迎斧正!

注:代码虽乱但全。若有错误和遗漏,请参见代码截图或评论!

USB的24脚和12脚TYPEC引脚定义 USB 是一种接口,用于将设备连接到计算机上。通过该连接,计算机可以向设备发送数据或检索来自设备的数据。USB 为开发者提供了一个标准接口,适用于多种不同类型的应用。借助于系统的设计过程,USB 设备易于连接和使用。本应用笔记会使该过程变得更加简单。以下是本应用笔记中会使用的概念:USB 历史USB 架构USB 物理接口USB 速度USB 电源USB 端点USB 通信协议USB 描述符USB 类设备USB 枚举与配置过程。 阅读详情

相关推荐

Wonderware Intouch 2014R2 SP1 安装教程

下载Wonderware System Platform 2014R2 SP1 and Intouch 2014R2 SP1的安装压缩包,如下 软件的下载连接地址如下: https://pan.baidu.com/s/1a2GnI_nfT3vK1l49B94FIQ, 提取码:6ec6 或者直接微信扫描下面的二维码 管理员运行下面的setup.exe可执行程序, 进入安装,选择Product Based Selection, 自定义选择需要安装的程序,如下: 普通的Into

工控先生 3万+

进程间通信——管道(匿名与命名)

从物理上分,可以将管道分为同主机的进程之间的通信和不同主机间的进程之间的通信。从通信方式上来分,管道又分为匿名管道和命名管道,下面就匿名管道和命名管道的特性作以阐述。匿名管道(pipe)[含义]:管道是一个进程的数据流到另一个进程的通道,即一个进程的数据的输出作为另一个进程的数据的输入,管道起到桥梁作用。比如:当我们输入:ls -l | cat test 其中的 ls 和 cat 是两个进程, |...

ypt 754

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

进程间通信-匿名管道

1.进程的概念 进程通信就是让两个不同的进程实现交换信息,数据。但是进程具有独立性,难以实现直接通信。但是,我们可以让进程看到同一公共空间或资源。公共空间或资源可以是文件,一段内存块等。所以实现进程间通信的方式有许多。 2.匿名管道的特点 (1)匿名管道只能单向通信。 (2)只能用于父子进程之间。 (3)匿名管道面向字节流。 (4)自带同步机制 (5)生命周期随进程结束。 3.匿名管道在进程中的使用 ...

m0_61106867的博客 1064

【扫地机器人测试】

本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。

xuhuaiyaun的博客 1372

基于Godot 4的战术RPG开发:模块化架构与核心系统实现

在游戏开发领域,模块化架构和回合制战斗系统是构建复杂策略游戏的基础。模块化设计通过关注点分离,将游戏逻辑分解为独立、可复用的组件,如数据模型、功能模块和场景,从而提升代码的可维护性和扩展性。回合制战斗系统则依赖于清晰的状态机循环,管理从单位选择、行动决策到伤害结算的完整流程,这是策略游戏体验的核心。这些技术为独立开发者提供了高效起点,能快速验证游戏原型。本文聚焦于一个专为Godot 4引擎设计的开源战术RPG模板,它正是运用了模块化架构和回合制状态机,实现了网格移动、相机控制和基础AI等核心功能。该模板通过

weixin_27021789的博客 616

通过匿名管道在进程间双向通信

由于匿名管道只能是单向的,因此要建立双向通信必须建立2个管道。 父程序代码: view plaincopy to clipboardprint? int main()    {        //定义四个句炳保留两个管道的信息        HANDLE hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;        SECU

jiht594的专栏 1635

SKUA-GOCAD入门教程-第六节

DisplayElements窗口是用于浏览和处理项目数据的工具,包含多个数据浏览器,如模型列表、对象、未分类对象、属性数据及资源数据。

江洋大葱的博客 983

进程间通信——匿名管道

基础知识: 匿名管道式一个未命名的,单向管道,通常用来在一个父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。 举个简单的的例子:   父进程的实现: 新建一个单文档类型的MFC应用程序,工程取名为:Parent, 为该工程增加一个子菜单,名称为“匿名管道” 为该子菜单添加三个菜单项, ID 菜单

n567656756765676567的专栏 487

我的世界进阶模组开发教程——制作机械动力附属模组

摘要: Create是Minecraft的机械动力模组,其代码结构分为多个关键模块: 数据生成系统:通过CreateRecipeProvider基类实现配方自动化生成,支持多步骤序列化装配配方(SequencedAssemblyRecipeGen),采用建造者模式链式调用; 注册管理:CreateRegistrate扩展了Registrate库,统一管理方块、流体、实体等注册,集成标签页分类和工具提示定制; 伤害系统:DamageTypeTagGen为机械伤害(如钻头、风扇火焰)定义原版兼容的标签; 客户端

qq_24992377的博客 2083

音视频开发基础(1):模拟视频技术简介

模拟视频技术是指用模拟技术对动态影像进行捕捉、记来、处理、存储、传输、复现的技术.模拟视频技术的发明、发展与模拟电视系统的发展密不可分.下面将通过模拟电视系统来介绍模拟视频技术中的基本概念. 首先,人的视觉系统的特征为电视等視稿系铳的发明、发展提供了理论依据.光线通过角膜、腫孔、晶状体的折射光线.透过玻璃体到达视网展.视网膜上分布着光感受器,光感受器在光线的剌激下...

琅嬛福地 1493

管道(Linux)

进程通信是什呢???把一个进程的代码和数据交给另一个进程,而这可以访问同样的代码和数据。我们可不可以直接让两个进程进行通信呢??不可以,因为进程具有独立性。为啥子要进行进程通信呢??🌟数据传输:一个进程需要将自己的代码和数据交给另一个进程,比如:一个进程读数据,一个进程写数据🌟资源共享:让不同进程看到同样的数据,比如王者中的地图。🌟获取数据:一个进程希望获取另一个进程的信息,比如父子之间,父进程等待子进程。

lim6ere的博客 1136

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

【Linux学习笔记】进程间通信之管道通信

本文介绍了Linux进程间通信中的管道通信机制,重点讲解了匿名管道的原理和使用方法。主要内容包括:进程间通信的目的(数据传输、资源共享等)和发展历程;管道的概念及其分类(匿名管道和命名管道);匿名管道的创建、读写规则和特点(半双工、原子性等);并通过代码示例展示了父子进程间通过管道通信的实现过程。最后还提出了基于管道的进程池框架,为后续更复杂的进程通信机制学习奠定了基础。管道作为Unix最古老的IPC方式,适用于具有亲缘关系的进程间通信。

大白的编程日记. 1156

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

进程间通信之管道

进程通信之管道

flyingcloud6的博客 1364

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

我们说匿名管道只能用于父子进程这样的关系通信,那么陌生进程怎么通信?我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct,从而通过文件的inode映射同一份文件来通信;而陌生的进程他们怎么看见同一份文件?通过什么叫文件内核缓冲区?来先看看一个朴素的通信:一个进程把数据写到磁盘上的一个文件,另一个进程从磁盘中读取来完成通信。

Au_ust的博客 808

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux——进程间通信(一):进程间通信的作用,匿名管道(命令,内核,PCB三个角度分析)

文章目录:1. 进程间通信的作用2. 匿名管道2.1 通过命令感受管道2.2 从内核角度解释管道2.3 创建管道 1. 进程间通信的作用 由于进程独立性的存在,两个进程想要直接交换数据是非常困难的,所以应用进程间通信来解决进程与进程之间交换数据的问题 2. 匿名管道 2.1 通过命令感受管道 ps: 命令 aux: 命令行参数 |: 管道 grep: 可执行程序 2.2 从内核角度解释管道 管道就是内核当中的一块缓冲区(一块内存),进程A和进程B可以通过这个缓冲区进行数据交换,匿名管道是不具备标

HanMeng的博客 641

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Wzs040810的博客 2412

Linux 进程通信——匿名管道

本文介绍了Linux中的匿名管道进程通信机制。主要内容包括:1. 进程通信的目的(数据传输、资源共享、通知事件、进程控制);2. 匿名管道的原理和特性,它只能用于父子进程间的通信,具备半双工、同步机制等特点;3. 演示了使用pipe()系统调用创建管道,并通过代码示例展示了父子进程的读写操作;4. 分析了四种通信情况(不同读写速度组合)的处理方式;5. 基于匿名管道实现了一个进程池,父进程通过轮询方式向子进程分发任务。匿名管道是Linux中简单高效的进程通信方式,适合有血缘关系的进程间通信需求。

2301_79976271的博客 744

Linux进程通信之管道

Linux进程通信 文章目录

weixin_47631612的博客 2718

【Linux】进程通信 && 管道

每一个进程都有自己对应的文件描述符表,【struct files_struct 进程和文件所对应的映射关系,严格来讲属于偏进程方面的,若要创建子进程就要创建它】里面有一个数组【fd_array[]】数组对应都有自己的下标,在进程的内部有指针指向自己的文件描述符表,当进程打开磁盘文件【文件 = 内容 + 属性】,找到inode和文件的映射关系,在内核当中就可以创建一个所对应的内核数据结构【struct file 】,里面包含有文件相关的属性集【inode 和 文件内核缓冲区】,文件的属性就可以放到inode里

C/C++、数据结构、Linux.... 1032

【小沐学C++】C++实现进程通信(管道pipe)

本节内容1、功能简介1.1 匿名管道1.2 命名管道2、匿名管道3、命名管道3.1 注意事项3.2 服务器3.2 客户端后记 1、功能简介 管道用于进程间共享数据,其实质是共享内存,常用IPC之一。管道不仅可以用于本机进程间通信,还可实现跨网络进程间通信,如同Socket通信,管道同样封装计算机底层网络实现,提供一个良好的API接口。 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端

爱看书的小沐 1万+

进程通信与匿名管道、进程池

有一些任务,需要进程之间的协作完成;典型的,我们在命令行输入如下指令,其中管道就是实现进程之间的通信的方式之一:mytest进程是一直循环;下面是查看进程信息的代码。其中管道的左右是两个进程,光靠某一个进程都无法实现目的,而管道实现了进程之间的通信达到了任务要求。进程的独立性:进程必须具有独立性,那么进程在通信时就不能将进程的全部信息交给另一个进程。进程的独立性让进程间通信的成本会高一些。

weixin_47875013的博客 862

[Linux打怪升级之路]-管道

本期学习目标:理解什么是管道,学会使用匿名管道和命名管道进行通信

分享技术 2668

linux下的进程通信

进程通信详解、管道、命名管道、匿名管道...

羊羊羊 1995

6.1进程间通信--管道(匿名管道、命名管道)

进程通信方式--匿名管道和命名管道

qq_64208053的博客 1191
上一篇: B树的插入
下一篇: 进程通信—命名管道
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值