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

进程间通信概述

进程间通信的目的是为了实现以下几个主要功能:

数据传输:一个进程需要将其数据发送给另一个进程。资源共享:多个进程之间共享相同的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(例如,进程终止时需要通知父进程)。进程控制:某些进程希望完全控制另一个进程的执行(例如,Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能及时了解其状态变化。

进程间通信的发展包括:

管道System V进程间通信POSIX进程间通信

进程间通信的分类包括:

管道:匿名管道(pipe)命名管道System V IPC:消息队列共享内存信号量POSIX IPC:消息队列共享内存信号量互斥量条件变量读写锁

管道

管道是一种最基本的进程间通信机制,主要用于具有亲缘关系的进程之间的通信,例如父子进程。

匿名管道

匿名管道用于父子进程之间的通信。以下是匿名管道的使用示例:

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

以下是使用管道进行通信的示例代码:

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

完整代码如下:

#include #include #include   // errno.h#include  // string.h#include #include #include const int size = 1024;std::string getOtherMessage(){    static int cnt = 0;    std::string messageid = std::to_string(cnt);     cnt++;    pid_t self_id = getpid();    std::string stringpid = std::to_string(self_id);    std::string message = "messageid: ";    message += messageid;    message += " my pid is : ";    message += stringpid;    return message;}// 子进程进行写入void SubProcessWrite(int wfd){    int pipesize = 0;    std::string message = "father, I am your son prcess!";    char c = 'A';    while (true)    {        std::cerr  0)        {            inbuffer[n] = 0; // == ''            std::cout  0) exit(0);        SubProcessWrite(pipefd[1]);        close(pipefd[1]);        exit(0);    }    std::cout  0)    {        std::cout >8)&0xFF) 

管道的读取和写入行为如下:

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

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

WiseHome家政预约小程序 0 查看详情 WiseHome家政预约小程序 如果管道内部为空且写端未关闭,读进程将被阻塞,直到写端写入数据。如果管道已满且读端未读取且未关闭,写进程将被阻塞,直到数据被读取。如果管道一直被读且写端关闭,读端的read返回值将为0,表示读到文件结尾。如果读端关闭,写端一直在写入,写端进程将被操作系统用13号信号终止,相当于进程出现异常。

管道的特征

匿名管道:仅用于具有亲缘关系的进程之间的通信,常用于父子进程之间。生命周期:随进程而存在。同步机制:管道内部自带进程间同步机制,具有明显的顺序性。字节流:管道文件在通信时是面向字节流的,写的次数和读取的次数不一定一一匹配。通信模式:管道的通信模式是一种特殊的半双工模式,数据只能向一个方向流动;需要双向通信时,需要建立两个管道。

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

当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性;当要写入的数据量大于PIPE_BUF时,Linux不再保证写入的原子性。原子操作意味着写入操作不会被中断,读方要么读不到数据,要么读到完整的数据。

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

进程池实现

进程池的实现可以利用管道进行进程间通信。以下是进程池实现的示例代码:

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

ProcessPool.cc:

#include #include #include #include #include #include #include "Task.hpp"// void work(int rfd)// {//     while (true)//     {//         int command = 0;//         int n = read(rfd, &command, sizeof(command));//         if (n == sizeof(int))//         {//             std::cout  0)//         {//             std::cout  *channels, task_t task){    for (int i = 0; i empty())                {                    // 第二次之后,开始创建的管道要关闭继承下来的写端                    for(auto &channel : *channels) channel.CloseChannel();                }                // child - read                close(pipefd[1]);                dup2(pipefd[0], 0); // 将管道的读端,重定向到标准输入                task();                close(pipefd[0]);                exit(0);            }            // 3.构建一个channel名称            std::string channel_name = "Channel-" + std::to_string(i);            // 父进程            close(pipefd[0]);            // a. 子进程的pid b. 父进程关心的管道的w端            channels->push_back(Channel(pipefd[1], id, channel_name));        }    }}// 0 1 2 3 4 channelnumint NextChannel(int channelnum){    static int next = 0;    int channel = next;    next++;    next %= channelnum;    return channel;}void SendTaskCommand(Channel &channel, int taskcommand){    write(channel.GetWfd(), &taskcommand, sizeof(taskcommand));}void ctrlProcessOnce(std::vector &channels){    sleep(1);    // a. 选择一个任务    int taskcommand = SelectTask();    // b. 选择一个信道和进程    int channel_index = NextChannel(channels.size());    // c. 发送任务    SendTaskCommand(channels[channel_index], taskcommand);    std::cout  &channels, int times = -1){    if (times > 0)    {        while (times--)        {            ctrlProcessOnce(channels);        }    }    else    {        while (true)        {            ctrlProcessOnce(channels);        }    }}void CleanUpChannel(std::vector &channels){    // int num = channels.size() -1;    // while(num >= 0)    // {    //     channels[num].CloseChannel();    //     channels[num--].Wait();    // }    for (auto &channel : channels)    {        channel.CloseChannel();        channel.Wait();    }    // // 注意    // for (auto &channel : channels)    // {    //     channel.Wait();    // }}// ./processpool 5int main(int argc, char *argv[]){    if (argc != 2)    {        std::cerr  channels;    // 1. 创建信道和子进程    CreateChannelAndSub(num, &channels, work1);    // 2. 通过channel控制子进程    ctrlProcess(channels, 5);    // 3. 回收管道和子进程. a. 关闭所有的写端 b. 回收子进程    CleanUpChannel(channels);    // sleep(100);    return 0;}

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

Task.hpp:

#pragma once#include #include #include #include #include #define TaskNum 3typedef void (*task_t)(); // task_t 函数指针类型void Print(){    std::cout  2)        return;    tasks[number]();}int SelectTask(){    return rand() % TaskNum;}void work(){    while (true)    {        int command = 0;        int n = read(0, &command, sizeof(command));        if (n == sizeof(int))        {            std::cout 

以上就是【Linux】进程间通信(匿名管道)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/820413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 03:02:40
下一篇 2025年11月27日 03:10:42

相关推荐

  • 比特币交易所app大盘点 2025年十大比特币购买平台汇总

    随着数字货币市场的不断成熟,选择一个安全可靠的比特币交易平台app变得至关重要。本文旨在为广大投资者梳理2025年最值得信赖和功能最全面的十大比特币购买平台,帮助您根据自身需求,找到最合适的交易工具,轻松开启您的数字资产投资之旅。 2025年比特币App综合实力排行榜 1. 币安 (Binance)…

    2025年12月9日
    000
  • 加密货币IDO平台top5

    2025年最佳IDO平台为pump.fun、Bounce、Coin Terminal、Avalaunch和Gate Launchpad,分别适合Meme币投机、社区驱动拍卖、高回报追求、Avalanche生态投资及新手公平参与,选择需结合投资目标、风险承受力与项目偏好,注重平台审核与安全性。 加密货…

    2025年12月9日
    000
  • 什么是Polkadot(DOT币)?DOT未来发展及价格预测

    目录 DOT(波卡币)是什么?Polkadot 的起源DOT(波卡币)的3 大用途Polkadot 的运作原理波卡币拥5 大特色,旨在建立波卡生态系(Ecosystem)1.互操作性2.可扩展性3.社区自治4.无分叉升级5.NPOS 共识协议Polkadot 的关键特性DOT 生态系统Polkado…

    2025年12月9日
    000
  • 欧易交易所(OKEx)app最新版v6.133.0安装

    欧易okex()是一家全球领先的数字资产交易平台,提供多种数字货币的交易服务。本指南将为您提供详细的下载和安装步骤,帮助您轻松开始使用欧易okex app进行数字货币交易。 下载安装步骤 1、欧易OKEx app是进行数字资产交易的重要工具,方便用户随时随地进行交易操作。为了确保下载安全,请务必通过…

    2025年12月9日
    000
  • 加密货币跨链桥是什么?有哪些好用的跨链桥?

    跨链桥是实现不同区块链间资产与数据互通的技术,通过锁定-铸造-释放机制促进多链互联。文章介绍了其核心原理、基于公证人、HTLC和中继链等技术类型,并推荐了Circle Gateway、Across Protocol、Polkadot中继链和Avalanche Bridge等主流工具,强调选择时需关注…

    2025年12月9日
    000
  • 近期值得关注的8个稳定币项目有哪些?一文盘点

    目录 capUSD.AILevelOpenEdenFalcon FinancePerenaNobleResolv结语 稳定币只能当美元使?这可能是我们对稳定币一直以来的印象。随着合规与大众普及叙事的推进,稳定币赛道正迎接着越来越多项目方的入局,也出现了越来越多值得关注获取收益的机会,不少顶级 vc …

    2025年12月9日 好文分享
    000
  • Pyth Network (PYTH币)是什么?会是下一个LINK吗?2025 年-2030年价格预测

    目录 Pyth Network 是什么?技术优势市场定位2025 年的 Pyth Network:增长、挑战和展望2025年价格预测2026年价格预测2027年价格预测2028年价格预测2029 – 2030 年价格预测结论 区块链智能合约无法自行访问现实世界的信息。为了有效执行,它们需要关于资产价…

    2025年12月9日
    000
  • RWA代币化崛起解读:现实资产上链的机遇与挑战

    一、RWA 代币化:金融变革的核心引擎 RWA(Real-World Asset)代币化,指的是通过区块链技术将现实中的资产——如房地产、政府债券、私募信贷等——转化为可交易的数字通证,实现资产的分割持有与链上流通。从2022年至2025年,这一领域规模由不足5亿美元迅速扩张至约240亿美元,三年复…

    2025年12月9日
    000
  • Tether(USDT币)是最安全的稳定币吗?一文介绍USDT币的安全评估

    评级公司是谁 Bluechip 是一家专注于稳定币安全评估的独立机构,致力于为个人与机构投资者提供权威的风险评级。该平台不依赖市场份额或品牌影响力进行评判,而是通过其专有的 SMIDGE 框架(Stability, Management, Implementation, Decentralizati…

    2025年12月9日
    000
  • 加密货币基本面与资金流的区别及如何选择

    加密货币投资需结合基本面与资金流:长期投资者应关注项目技术、团队等基本面因素以评估内在价值,而短期交易者可依赖交易量、资金流动等资金流数据把握市场时机,两者互补使用并参考权威数据源如CoinMarketCap和Glassnode,能更有效降低风险、提升决策质量。 加密货币基本面与资金流的区别及如何选…

    2025年12月9日
    000
  • 币安下载了怎么打不开?

    币安App打不开主因是网络限制及设备设置问题,需通过海外VP N、切换语言地区、清除缓存、重装官方最新版App等步骤解决,确保系统更新并授权必要权限。 币安App打不开?原因分析与全面解决指南 下载了币安(Binance)应用程序却无法打开,这是一个令人沮丧的常见问题。其背后原因多样,可能源于您的设…

    2025年12月9日
    000
  • 加密货币空投信息聚合的网站有哪些

    加密货币空投信息聚合网站包括Airdrop Alert、One Click Airdrop Tracker、Free Airdrop.io和CoinMarketCap空投板块,这些平台整合全网空投项目,提供分类筛选、任务指引和参与进度跟踪等功能,帮助用户高效获取免费代币。 加密货币空投信息聚合的网站…

    2025年12月9日
    000
  • 加密货币免费链上数据查询网址有哪些

    链上数据是加密货币投资者、开发者和研究人员分析市场动态与协议健康度的关键依据,文章介绍了多类免费工具。DeFiLlama 提供多链TVL追踪与DeFi生态全景分析;Blockchair 支持48条链的高级搜索与财务报表生成;CryptoHouse 实现Ethereum和Solana的实时SQL查询;…

    2025年12月9日
    000
  • 加密货币链上数据分析网站有哪些

    Glassnode、Nansen、Chainalysis、Dune Analytics、BitInfoCharts和欧科云链链上天眼是主流链上数据分析平台,分别侧重市场情绪、资金追踪、合规风控、定制化查询、基础数据与中文本地化服务,满足不同用户需求。 2025主流比特币交易所: 欧易官网: 欧易官方…

    2025年12月9日
    000
  • 什么是量化交易?避免人性弱点,币圈必懂的聪明自动理财术

    目录 一、什么是量化交易?二、量化交易的核心原理三、量化交易的基本流程四、常见的量化交易策略类型五、量化交易的主要策略六、量化交易的优势与劣势优势:劣势与挑战:七、总结与展望 刚刚接触加密货币的朋友,或许有听过量化交易这个名词。这个东西时常跟大数据与人工智慧绑在一起,对普通人来说非常难懂。究竟量化交…

    2025年12月9日
    000
  • 加密货币链上交易和数据分析工具有哪些

    链上数据分析工具多样,DeFiLlama和Etherscan适合初学者免费使用,Glassnode和CryptoQuant专精比特币与宏观趋势,DeBank用于跟踪个人资产与鲸鱼动向,Dune Analytics支持自定义查询,Bubblemaps可视化持仓分布,Santiment结合情绪分析,选择…

    2025年12月9日
    000
  • 加密货币链上交易所top10优缺点分析

    Uniswap v3以集中流动性提升资金效率,Jupiter依托Solana实现低费高速,Curve专注稳定币低滑点交易,1inch聚合多链流动性优化价格,dYdX引领去中心化衍生品交易,PancakeSwap提供低成本BSC交易,SushiSwap探索社区治理,Balancer支持定制化做市,Or…

    2025年12月9日
    000
  • 加密货币新币上的比较快的交易所有哪些

    MEXC和Gate.io上新速度最快,币安综合实力最强,火币HTX流动性优异,投资者应根据风险偏好选择平台并理性决策。 在加密货币领域,谁能更快上线新代币,谁就能为投资者抢占先机。新代币上线速度已成为衡量交易平台市场竞争力的关键指标之一,直接影响着用户的投资机会和收益潜力。目前市场呈现“一超多强”的…

    2025年12月9日
    000
  • 加密货币自带量化机器人的交易所有哪些?好用吗

    Binance、OKX、KuCoin、Bybit、Gate.io均自带量化机器人,其中Binance和OKX综合表现最佳。Binance免费提供8种策略,适合新手到进阶用户,滑点控制优秀;OKX策略丰富,回测支持10年数据,适合专业交易者但需付费;KuCoin操作简易全免费,适合新手但策略有限;By…

    2025年12月9日
    000
  • 10大“数字货币+互联网金融”股票有哪些

    10大“数字货币+互联网金融”股票包括四方精创、京北方、中科金财、恒生电子、东方财富、同花顺、拉卡拉、银之杰、长亮科技、宇信科技,这些公司均在数字货币技术或应用与互联网金融领域有实质性布局,具备较强的技术实力、市场地位及业务协同优势,部分企业参与央行数字货币项目、跨境支付系统建设或拥有高市占率的金融…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信