进程间通信方法——匿名管道

news/2024/11/23 0:39:39/

什么是管道?

  • 管道是Unix中最古老的进程间通信的形式。
  • 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”

 什么是匿名管道

就是一个没有名字的管道。

#include <unistd.h>
功能:创建一无名管道
原型
int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码

 

管道通信的原理

在父进程调用pipe函数来创建管道,在文件对象数组加入该管道的读与写的文件描述符,fork创建子进程之后,子进程会复制父进程所有的管理信息。此时在关闭子进程和父进程相关的读写文件操作,保证一端读一端写即可完成通信。

 

 

 管道的读写规则

  • 当没有数据可读时
    • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
    • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。
  • 当管道满的时候
    • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
    • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN
  • 如果所有管道写端对应的文件描述符被关闭,则read返回0
  • 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出
  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性(写完才读,读完才写)。
  • 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

管道特点

  • 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
  • 管道提供流式服务
  • 一般而言,进程退出,管道释放,所以管道的生命周期随进程
  • 一般而言,内核会对管道操作进行同步与互斥
  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

 

 


http://www.ppmy.cn/news/789068.html

相关文章

ChatGPT在游戏开发中的应用如何?

ChatGPT在游戏开发中具有广泛的应用潜力&#xff0c;可以提供多方面的支持和改进。以下是ChatGPT在游戏开发中的一些应用场景&#xff1a; 1. 任务和剧情生成&#xff1a;ChatGPT可以帮助游戏开发人员生成丰富多样的任务和剧情内容。它可以分析游戏世界的规则和玩家的动作&…

三星SAMSUNG SCX-4720FN 驱动

三星SAMSUNG SCX-4720FN 驱动是官方提供的一款一体机&#xff08;打印/扫描&#xff09;驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决一体机与电脑连接不了&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8…

Windows远程连接共享打印机

Windows远程连接共享打印机 背景准备步骤打印机端服务器端 测试 背景 需要做一个项目&#xff0c;服务器远程连接共享打印机打印。 准备 工具内容系统版本&#xff1a;WIn10打印机型号&#xff1a;Samsung SCX-3400 Series直连打印机电脑&#xff08;打印机端&#xff09;IP…

三星Samsung CLX-6260ND 驱动

三星Samsung CLX-6260ND 驱动是官方提供的一款一体机&#xff08;打印/扫描&#xff09;驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决一体机与电脑连接不了&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8…

linux 网卡重新扫描,在ubuntu桌面配置一个网络打印机和扫描仪的方法,

在ubuntu桌面配置一个网络打印机和扫描仪的方法&#xff0c; 在之前的文章中, 我们讨论过如何在Linux服务器安装各种各样的打印机(当然也包括网络扫描仪)。今天我们将来处理另一端&#xff1a;如何通过桌面客户端来访问网络打印机/扫描仪。 网络环境 在这个安装教程中&#xff…

【ElasticSearch】JavaRestClient实现索引库和文档的增删改查

文章目录 一、RestClient1、什么是RestClient2、导入demo工程3、数据结构分析与索引库创建4、初始化JavaRestClient 二、RestClient操作索引库1、创建索引库2、删除索引库3、判断索引库是否存在 三、RestClient操作文档1、新增文档2、查询文档3、修改文档4、删除文档5、批量导入…

linux 远程扫描仪,技术|如何在ubuntu桌面配置一个网络打印机和扫描仪

在之前的文章中, 我们讨论过如何在Linux服务器安装各种各样的打印机(当然也包括网络扫描仪)。今天我们将来处理另一端:如何通过桌面客户端来访问网络打印机/扫描仪。 网络环境 在这个安装教程中,我们的服务器(Debian Wheezy 7.2版本)的IP地址是192.168.0.10,我们的客户端(Ub…

打印机打开扫描提示使用该设备需要WIA驱动程序。请从安装CD或从制造商的网站安装此程序,然后重试--------

打印机打开扫描提示使用该设备需要WIA驱动程序。请从安装CD或从制造商的网站安装此程序&#xff0c;然后重试--------处理方法 方法/步骤 1 右键此电脑&#xff0c;选择管理 2 在计算机管理中选择设备管理器&#xff0c;并点选图像设备 3 如果相关驱动有黄色感叹号或问号&am…