使用Linux命名管道(FIFO)实现无血缘关系进程间通信

使用Linux命名管道(FIFO)实现无血缘关系进程间通信

使用Linux命名管道实现无血缘关系进程间通信

1. 引言

在Linux系统中,进程间通信(IPC)是编程中常见的需求。传统上,有血缘关系的进程(如父子进程)可以通过管道进行通信,但无血缘关系的进程则需要其他IPC机制。本文将介绍如何使用Linux命名管道(FIFO)实现无血缘关系进程间的通信,展示其原理、实现方法和实际应用场景。

2. 命名管道(FIFO)概述

命名管道(FIFO, First In First Out)是一种特殊的文件类型,它允许不相关的进程之间进行通信。与匿名管道不同,命名管道不要求通信的进程之间有血缘关系,因此可以用于任意两个进程之间的通信。

命名管道的主要特点包括:

  1. 命名管道存在于文件系统中,可以通过路径名访问
  2. 命名管道是单向的,数据只能在一个方向上流动
  3. 命名管道不要求通信的进程之间有血缘关系
  4. 命名管道在内核中维护,不占用磁盘空间
  5. 当所有进程关闭了命名管道的文件描述符时,命名管道的内容会被销毁

3. 创建和使用命名管道

3.1 使用命令行创建命名管道

可以使用mkfifo命令在命令行中创建命名管道:

mkfifo my_pipe 

这将在当前目录下创建一个名为my_pipe的命名管道文件。

3.2 使用C语言创建命名管道

在C语言中,可以使用mkfifo函数来创建命名管道:

#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>intmain(){constchar*fifo_path ="/tmp/my_fifo";// 创建命名管道if(mkfifo(fifo_path,0666)==-1){perror("mkfifo");exit(EXIT_FAILURE);}printf("Named pipe created: %s\n", fifo_path);return0;}

4. 实现无血缘关系进程间通信

4.1 写进程示例

下面是一个写进程的示例代码,它向命名管道写入数据:

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>intmain(){constchar*fifo_path ="/tmp/my_fifo";constchar*message ="Hello from writer process!";// 以只写方式打开命名管道int fd =open(fifo_path, O_WRONLY);if(fd ==-1){perror("open");exit(EXIT_FAILURE);}// 向命名管道写入数据write(fd, message,strlen(message));printf("Message sent: %s\n", message);// 关闭命名管道close(fd);return0;}

4.2 读进程示例

下面是一个读进程的示例代码,它从命名管道读取数据:

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#defineBUFFER_SIZE256intmain(){constchar*fifo_path ="/tmp/my_fifo";char buffer[BUFFER_SIZE];// 以只读方式打开命名管道int fd =open(fifo_path, O_RDONLY);if(fd ==-1){perror("open");exit(EXIT_FAILURE);}// 从命名管道读取数据int bytes_read =read(fd, buffer, BUFFER_SIZE -1);if(bytes_read ==-1){perror("read");exit(EXIT_FAILURE);} buffer[bytes_read]='\0';// 确保字符串以null结尾printf("Message received: %s\n", buffer);// 关闭命名管道close(fd);return0;}

4.3 运行示例

要运行这个示例,首先需要创建命名管道,然后分别编译和运行写进程和读进程。需要注意的是,读进程应该先于写进程启动,因为读进程在打开命名管道时会阻塞,直到有另一个进程以写方式打开同一个命名管道。

# 创建命名管道mkfifo /tmp/my_fifo # 编写进程 gcc writer.c -o writer ./writer &# 读进程 gcc reader.c -o reader ./reader 

5. 命名管道的高级特性

5.1 非阻塞打开命名管道

默认情况下,以只读或只写方式打开命名管道会导致进程阻塞,直到有另一个进程以相反的方式打开同一个命名管道。为了避免阻塞,可以在打开命名管道时指定O_NONBLOCK标志:

// 非阻塞方式打开命名管道int fd =open(fifo_path, O_RDONLY | O_NONBLOCK);

5.2 使用select或poll监控命名管道

可以使用selectpoll函数来监控命名管道的可读性或可写性,从而避免阻塞:

#include<sys/select.h>#include<poll.h>// 使用select监控命名管道 fd_set read_fds;structtimeval timeout;FD_ZERO(&read_fds);FD_SET(fd,&read_fds); timeout.tv_sec =5;// 5秒超时 timeout.tv_usec =0;int ret =select(fd +1,&read_fds,NULL,NULL,&timeout);if(ret >0){if(FD_ISSET(fd,&read_fds)){// 命名管道可读// 执行读取操作}}// 使用poll监控命名管道structpollfd fds; fds.fd = fd; fds.events = POLLIN;// 监控可读事件int ret =poll(&fds,1,5000);// 5秒超时if(ret >0){if(fds.revents & POLLIN){// 命名管道可读// 执行读取操作}}

6. 命名管道的注意事项

  1. 单向通信:命名管道是单向的,如果需要双向通信,需要创建两个命名管道。
  2. 阻塞行为:默认情况下,打开命名管道会导致进程阻塞,直到有另一个进程以相反的方式打开同一个命名管道。
  3. 数据完整性:写入命名管道的数据可能会被截断,特别是在写入大量数据时。因此,需要确保数据的完整性。
  4. 错误处理:在使用命名管道时,需要正确处理各种错误情况,如管道不存在、权限不足等。
  5. 资源清理:使用完命名管道后,应该关闭文件描述符,并在不需要时删除命名管道文件。

7. 实际应用场景

命名管道在实际开发中有多种应用场景,例如:

  1. 日志收集系统:多个不同的应用程序可以将日志写入同一个命名管道,而日志收集进程则从该管道读取日志。
  2. 服务间通信:在微服务架构中,可以使用命名管道作为轻量级的进程间通信机制。
  3. 命令行工具:命令行工具可以使用命名管道接收来自其他程序的输入或发送输出到其他程序。
  4. 测试框架:在测试过程中,可以使用命名管道模拟不同组件之间的交互。

8. 总结

本文介绍了Linux命名管道(FIFO)的基本概念、创建方法以及如何使用它来实现无血缘关系进程间的通信。通过示例代码,展示了如何创建命名管道、打开和关闭命名管道,以及如何使用命名管道进行进程间通信。此外,还介绍了命名管道的高级特性和注意事项。

命名管道是一种简单而有效的进程间通信机制,特别适用于不相关的进程之间的通信。通过合理使用命名管道,可以实现进程间的数据交换和同步,提高程序的灵活性和可扩展性。

Read more

Flutter 组件 deepseek 的适配 鸿蒙Harmony 实战 - 驾驭国产最强大模型 API、实现鸿蒙端 AI 原生对话与流式渲染的高效集成方案

Flutter 组件 deepseek 的适配 鸿蒙Harmony 实战 - 驾驭国产最强大模型 API、实现鸿蒙端 AI 原生对话与流式渲染的高效集成方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 deepseek 的适配 鸿蒙Harmony 实战 - 驾驭国产最强大模型 API、实现鸿蒙端 AI 原生对话与流式渲染的高效集成方案 前言 在 AI 浪潮席卷全球的今天,大模型(LLM)已成为移动应用创新的核心引擎。而在众多的国产模型中,DeepSeek 凭借其卓越的算法效率和极致的性价比,正成为开发者们的“真香”选择。 将 DeepSeek 这种顶尖的认知能力,植入到全面拥抱智能化、万物互联的鸿蒙(OpenHarmony)系统中,将碰撞出怎样的火花? deepseek 库为 Flutter 提供了极简的 API 封装,它完美支持了 SSE(流式事件流)响应,能让你的鸿蒙 App

By Ne0inhk
【2025年度创作】分享和总结如何通过AI快速开发一款MCP(模型上下文协议)服务插件,并进行本地和线上部署测试,最后上架MCP以及智能体调用MCP插件

【2025年度创作】分享和总结如何通过AI快速开发一款MCP(模型上下文协议)服务插件,并进行本地和线上部署测试,最后上架MCP以及智能体调用MCP插件

一年一度的ZEEKLOG博客之星活动现已开启!时光飞逝,2025的代码即将合上尾页,指针向前,2026的技术新篇静待启封。这一年,我依然坚持在ZEEKLOG平台持续创作,也见证了AI与智能体领域的持续升温,特别是MCP(模型上下文协议)技术带来的崭新突破。 值此ZEEKLOG平台年度技术盛会之际,博主将撰写一篇技术实战总结型文章,系统分享如何利用AI高效开发MCP服务插件,涵盖从本地调试、线上部署到智能体使用的全流程。 目录 * MCP简介 * 安装插件 * MCP开发 * 创建表 * 提示词 * 启动服务 * 本地部署MCP * 调用测试 * 线上部署 * 上传源码 * 安装Python * 安装依赖 * 启动服务 * nginx反向代理 * 本地测试 * 上架MCP * 使用MCP * MCP和API区别 * 总结 MCP简介 MCP(Model Context Protocol,模型上下文协议) 是专为大语言模型(LLM)应用设计的开放协议,旨在实现 LLM 与外部工具和数据源的无

By Ne0inhk
OpenClaw 2026史诗级爆发:三天三版本颠覆AI智能体,企业落地ROI超300%

OpenClaw 2026史诗级爆发:三天三版本颠覆AI智能体,企业落地ROI超300%

一、社区狂欢:三天三连更,创下开源 AI 更新纪录 2026 年 3 月,GitHub 星标突破 27.8 万的开源 AI 智能体框架 OpenClaw(外号 "龙虾")上演了一场技术圈的狂欢 ——3 月 7 日至 12 日,连续推出 v2026.3.7、3.8、3.12 三个重磅版本,89 项功能更新、200+Bug 修复、10 + 高危漏洞修补,被 36Kr 评为 "史上最猛更新&

By Ne0inhk
国产五大AI模型哪家强?DeepSeek、豆包、Kimi、智谱清言、通义千问深度解析!哪款大模型更适合你?

国产五大AI模型哪家强?DeepSeek、豆包、Kimi、智谱清言、通义千问深度解析!哪款大模型更适合你?

今天我们来聊聊当下最火的五款国产AI大模型——DeepSeek、豆包、Kimi、智谱清言和通义千问。 它们各有千秋,有的擅长专业分析,有的专攻娱乐互动,还有的靠“长文本”出圈……究竟谁更适合我们的需求?看完这篇就懂了! 一、DeepSeek:高性价比推理强者 DeepSeek是深度求索推出的大语言模型,堪称2025年AI界的“黑马”。它推理能力超强,表现和GPT-4不相上下。春节期间的爆火,使其成为史上用户增速最快的AI应用。 1、特点 语义理解能力强: 能吃透问题,给出精准答案。比如搞学术研究,我们问专业领域的复杂问题,它可以快速翻找资料,整理出关键信息,条理清晰地解答,帮我们省下不少时间。写论文时,还能帮着生成大纲、分析文献综述。 开源与本地化支持: 完全开源,支持本地部署,用户可以根据需求定制模型,同时完全掌控数据隐私。 其API服务价格亲民,输入/输出每百万tokens的成本分别为2元和8元,适合中小企业和个人开发者使用。 高性能与低成本: 在多项基准测试中,DeepSeek的表现接近甚至超越了Claude-Sonnet和GPT-4o等国际顶尖模型。其训练成

By Ne0inhk