0

0

【Linux】进程间通信——匿名管道

絕刀狂花

絕刀狂花

发布时间:2025-06-19 15:52:20

|

256人浏览过

|

来源于php中文网

原创

  1. 进程间通信的目的包括数据传输、资源共享、通知事件和进程控制。数据传输是指一个进程需要将数据发送给另一个进程;资源共享是指多个进程共享相同的资源;通知事件是指一个进程需要向另一个或一组进程发送消息,告知发生了某种事件,如进程终止时通知父进程;进程控制是指某些进程希望完全控制另一个进程的执行,如Debug进程希望能够拦截另一个进程的所有陷入和异常,并及时了解其状态变化。

?由于进程具有独立性,不同进程间如何通信呢?进程间通信首先需要让不同的进程看到同一份资源(某种形式的内存空间)。由于进程具有独立性的特性,一个进程不能在另一个进程中操作某种资源,因此该资源的提供者不能是进程,只能是操作系统,这也是进程间通信的核心。

【Linux】进程间通信——匿名管道 进程间通信有两类通信方案——本地通信和网络通信;本地通信指的是在同一台主机同一个操作系统下,不同进程间的通信;本文主要讨论本地通信,网络通信将在后续学习。

  1. Linux进程间通信可以分为以下几种分类:

匿名管道(Pipe):管道是一种半双工的通信机制,可以在同一个进程中的两个文件描述符之间传递数据。 命名管道(Named Pipe):命名管道也是一种半双工的通信机制,但可以在不同进程之间进行通信。 信号(Signal):信号是一种在进程之间传递简单消息的机制,主要用于进程之间的通知和同步。 消息队列(Message Queue):消息队列是一种通过消息传递进行通信的机制,可以在不同进程之间传递消息。 共享内存(Shared Memory):共享内存是一种进程间通信的高效机制,多个进程可以通过映射同一块内存区域来实现数据的共享。 信号量(Semaphore):信号量是一种用于进程之间同步和互斥的机制,可以用来控制对共享资源的访问。 套接字(Socket):套接字是一种可以在不同主机之间进行进程间通信的机制,可以实现分布式系统间的通信。 文件锁(File Lock):文件锁是一种用于进程之间同步和互斥的机制,可以通过锁定文件来控制对共享资源的访问。 根据具体的业务需求选择适合的进程间通信方式,每种通信方式都有其特点和适用场景。

  1. 管道是一种最简单的进程间通信方式,可以通过创建一个管道文件来实现两个进程之间的通信。读进程从管道中读取数据,写进程向管道中写入数据。管道只能在具有父子关系的进程之间使用。

父进程创建子进程后,子进程会拷贝父进程的task_struct,同样父进程在创建子进程之前打开了一个文件,子进程也会拷贝该文件的struct file,此时两个进程就指向同一个操作系统提供给该文件的内核缓冲区,所以就可以通过该文件的内核缓冲区进行通信了:

【Linux】进程间通信——匿名管道 管道分为匿名管道pipe和命名管道。

  1. 在Linux中,匿名管道(anonymous pipe)是一种常用的进程间通信机制。它的原理与上图类似,是通过pipe系统调用来创建一个管道文件,该文件与上图文件不同,没有inode,也不需要写入磁盘,仅仅用来给父子进程间进行通信,可以说是一次性使用的,没有名字,所以称为匿名管道。

创建匿名管道的思路如下:

父进程调用系统调用创建管道:【Linux】进程间通信——匿名管道父进程创建子进程:【Linux】进程间通信——匿名管道如果父进程写入,子进程读取,那么就将父进程读取端关闭,子进程写入端关闭;如果父进程读取,子进程写入,那么就反之:【Linux】进程间通信——匿名管道【Linux】进程间通信——匿名管道管道的通信是单向的,即父进程或子进程不能对一个管道同时读和写,只能选择一个,父进程读,子进程就写;子进程读,父进程就写。

在Linux系统中,可以使用以下系统调用接口创建匿名管道:

#include 
int pipe(int pipefd[2]);

该函数会创建一个管道,并将相应的读取和写入文件描述符存储在pipefd数组中。pipefd[0]表示读取端文件描述符,pipefd[1]表示写入端文件描述符。

使用示例:

WiseHome家政预约小程序
WiseHome家政预约小程序

家政服务平台系统包含家用电器安装清洗、搬家、家电维修、管道疏通、月嫂保姆、育儿陪护、上门开锁等多种服务项目,用户可以直接通过家政小程序咨询,在线预约服务类型,同时还设置有知识科普,给用户科普一些清洁保养小技巧,让用户能够足不出户就可以直接预约服务,方便又快捷。本项目使用微信小程序平台进行开发。使用腾讯专门的小程序云开发技术,云资源包含云函数,数据库,带宽,存储空间,定时器等,资源配额价格低廉,无需

下载
#include 
#include 
int main() {
    int pipefd[2];
    int ret = pipe(pipefd);
if (ret == -1) {
    perror("pipe");
    return 1;
}

printf("读取端文件描述符:%d\n", pipefd[0]);
printf("写入端文件描述符:%d\n", pipefd[1]);

return 0;

}

运行以上程序,会输出管道的读取和写入端文件描述符。

以下是一个通过匿名管道简单实现进程间通信的代码:

#include

include

include

include

include

include

//子进程写,父进程读 int main(){ //1.创建管道 int pipefd[2]; int n = pipe(pipefd); if(n == -1) { std::cerr << "pipe error" << std::endl; exit(1); } //2.创建子进程 pid_t pid = fork(); if(pid < 0) { std::cerr << "fork error" << std::endl; exit(1); } else if(pid == 0) { //子进程 close(pipefd[0]); //关闭读取端 std::string message = "Hello from child!"; write(pipefd[1], message.c_str(), message.size()); close(pipefd[1]); //关闭写入端 exit(0); } else { //父进程 close(pipefd[1]); //关闭写入端 char buffer[1024]; int count = read(pipefd[0], buffer, sizeof(buffer) - 1); if(count > 0) { buffer[count] = 0; std::cout << "Message from child: " << buffer << std::endl; } close(pipefd[0]); //关闭读取端 } return 0; }

将该代码编译为可执行文件后运行结果如下:

【Linux】进程间通信——匿名管道在进程间通信时,可能会出现以下场景:

管道为空,read会阻塞管道为满,write会阻塞管道写端关闭,读端最终会读到0,表示已经读到文件结尾管道读端关闭,操作系统会直接杀掉写入的进程匿名管道特性:

面向字节流 只能通过具有血缘关系比如父子/兄弟的进程使用,常用于父子进程间通信 文件的生命周期随进程,管道也是 管道通信是单向的管道自带同步互斥等机制,也就是说管道在写的时候不能读取,读的时候不能写入

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

235

2023.10.07

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1133

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1798

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1415

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

706

2023.06.29

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.1万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号