【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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
优化 Java 函数内存使用:问题和解决方案
上一篇 2025年11月27日 03:10:27
php系统需要哪些软件
下一篇 2025年11月27日 03:10:38

相关推荐

  • linux如何关机

    linux如何关机 1、有界面的Linux关机方法: 在桌面右上角有关机图标、或下拉三角形图标,点开即可找到关机。 2、通过终端关机 立刻关机: sudo shutdown -h nowsudo init 0poweroff 延时关机: sudo shutdown -h 10 [“准备关机”] //…

    2026年8月28日
    200
  • PHP:高效检查多维数组中是否存在重复的嵌套项

    本文将探讨如何在 php 中有效检查一个多维数组是否已包含具有相同嵌套项的元素。针对 `in_array()` 函数在处理复杂数组时的局限性,我们将介绍通过迭代和直接比较嵌套子数组的方法,确保在添加新数据前避免重复,从而维护数据结构的唯一性和完整性。 在 PHP 开发中,我们经常需要处理包含复杂数据…

    2026年8月28日
    100
  • 耶鲁、剑桥等开发MindLLM,将脑成像直接转换为文本

    耶鲁、剑桥等开发MindLLM,将脑成像直接转换为文本耶鲁、剑桥等开发MindLLM,将脑成像直接转换为文本耶鲁、剑桥等开发MindLLM,将脑成像直接转换为文本耶鲁、剑桥等开发MindLLM,将脑成像直接转换为文本

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 编辑 | 萝卜皮 将功能性磁共振成像 (fMRI) 信号解码为文本一直是神经科学界面临的一项重大挑战,它有望推动脑机接口的发展,并加深对大脑机制的了解。然而,现有的方法往往存在预测性能不佳、任务…

    2026年8月28日 用户投稿
    000
  • 首个强化生成模型AbNovo实现多目标、多约束抗体从头设计,发表于ICLR 2025

    首个强化生成模型AbNovo实现多目标、多约束抗体从头设计,发表于ICLR 2025首个强化生成模型AbNovo实现多目标、多约束抗体从头设计,发表于ICLR 2025首个强化生成模型AbNovo实现多目标、多约束抗体从头设计,发表于ICLR 2025首个强化生成模型AbNovo实现多目标、多约束抗体从头设计,发表于ICLR 2025

    上海交大医学院张海仓课题组联合中原人工智能产业技术研究院及中科院计算所,研发出一款名为abnovo的创新抗体设计工具。该工具巧妙地结合强化学习和深度扩散模型,能够在多重目标和约束条件下,高效完成抗体从头设计。这项研究成果已发表于国际顶级机器学习会议iclr 2025,论文标题为“multi-obje…

    2026年8月28日 用户投稿
    000
  • laravel表单请求(Form Request)如何使用_Laravel表单请求Form Request使用方法

    Laravel的Form Request用于分离验证与授权逻辑。1. 使用artisan命令生成请求类;2. 在authorize中设置权限,rules中定义规则;3. 可自定义messages错误信息;4. 控制器直接注入使用,自动验证;5. 可通过prepareForValidation预处理数…

    2026年8月28日
    000
  • 《要塞十字军东征:决定版》现已登陆Steam 获特别好评

    《要塞十字军东征:决定版》现已登陆Steam 获特别好评《要塞十字军东征:决定版》现已登陆Steam 获特别好评《要塞十字军东征:决定版》现已登陆Steam 获特别好评《要塞十字军东征:决定版》现已登陆Steam 获特别好评

    经典城堡模拟rts作品《要塞十字军东征:决定版(stronghold crusader: definitive edition)》已于昨日正式登陆pc steam平台,目前正处于首发优惠期间。游戏原价76元,享受10%折扣后现价68.4元,支持简体中文语言,并已收获玩家“特别好评”。 准备好你的武器…

    2026年8月28日 用户投稿
    500
  • 日志切割(Log Rotation)与集中管理

    我们需要日志切割和集中管理,因为它们能有效管理和分析系统日志。1) 日志切割将大文件分割成小文件,解决磁盘空间问题并简化日志查找和分析。2) 集中管理将不同来源的日志汇总到一起,方便统一监控和分析,提升系统运维效率。 日志切割和集中管理是运维中非常重要的两个概念,它们帮助我们更好地管理和分析系统日志…

    2026年8月28日
    000
  • 手把手教你电脑操作系统怎么查正版

    手把手教你电脑操作系统怎么查正版手把手教你电脑操作系统怎么查正版手把手教你电脑操作系统怎么查正版手把手教你电脑操作系统怎么查正版

    大家应该都清楚,电脑操作系统存在正版、盗版以及授权的区别,那么问题来了,如何判断windows 10系统是不是正版呢?别担心,有我在,接下来我就给大家分享一下如何检查电脑系统是否为正版的操作步骤。 操作流程如下: 首先,点击屏幕左下角的“开始菜单”,然后选择“设置”以进入设置界面。 接着,点击左侧菜…

    2026年8月28日 用户投稿
    000
  • linux磁盘满了怎样清理?

    linux磁盘满了怎样清理?linux磁盘满了怎样清理?linux磁盘满了怎样清理?linux磁盘满了怎样清理?

    linux磁盘满了怎样清理? 1、查看磁盘信息 df –lh 我们可以看见Filesystem下的挂载点 /dev/xvda1 下的40G容量已经耗尽。接下来就是删除占用磁盘空间大,但又无用的文件。 推荐:《linux使用教程》 2、定位最大文件目录 cd / #进入根目录。du -h –max-…

    2026年8月28日 用户投稿
    000
  • linux 区别

    <img src="https://img.php.cn/upload/article/000/000/029/5dbf811e9509e987.jpg" alt="linux 区别” > 区别: > 覆盖输出到文本          (推…

    用户投稿 2026年8月28日
    200
  • Laravel邮件服务(Mail Services)集成

    在laravel中集成邮件服务可以通过以下步骤实现:1) 配置邮件驱动,如smtp、mailgun或sendmail;2) 使用mail facade发送邮件,支持纯文本和html格式;3) 创建并使用邮件模板提高可维护性;4) 利用队列功能提高邮件发送的可靠性和效率;5) 设置速率限制和监控日志以…

    2026年8月28日
    100
  • linux >>是什么意思

    >是什么意思” > >>   (推荐学习:linux运维) 这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响 使用>> 会出现什么情况,发现元文本追加了一行。 [r…

    2026年8月28日
    200
  • 高通牵手诺基亚贝尔实验室,展示无线网络中可互操作的多厂商AI的价值

    高通牵手诺基亚贝尔实验室,展示无线网络中可互操作的多厂商AI的价值高通牵手诺基亚贝尔实验室,展示无线网络中可互操作的多厂商AI的价值高通牵手诺基亚贝尔实验室,展示无线网络中可互操作的多厂商AI的价值高通牵手诺基亚贝尔实验室,展示无线网络中可互操作的多厂商AI的价值

    ai赋能无线网络:高通与诺基亚联合展示多厂商ai互操作性 本文介绍高通和诺基亚在2024年世界移动通信大会(MWC 2024)上展示的成果:一个基于AI的、可互操作的多厂商无线网络系统。该系统显著提升了网络吞吐量,并在不同物理环境中展现出强大的鲁棒性。 关键发现: AI模型在各种物理环境(包括室内外…

    2026年8月28日 用户投稿
    100
  • MySQL数据库版本升级与兼容性处理_平滑过渡与风险规避实战

    MySQL数据库版本升级与兼容性处理_平滑过渡与风险规避实战MySQL数据库版本升级与兼容性处理_平滑过渡与风险规避实战MySQL数据库版本升级与兼容性处理_平滑过渡与风险规避实战MySQL数据库版本升级与兼容性处理_平滑过渡与风险规避实战

    mysql数据库版本升级需精密规划与执行,核心在于预见性与可控性。第一步明确升级动因与目标版本特性,如性能、安全、功能变化及兼容性问题。第二步构建高度相似的测试环境,导入生产数据并执行全面测试。第三步制定备份与回滚策略,结合逻辑与物理备份并验证其可用性。第四步执行升级,采用主从切换等策略最小化停机时…

    2026年8月28日 用户投稿
    100
  • 为什么高频率内存条在有些主板上无法达到标称速度?

    答案:高频内存无法达到标称速度是因CPU内存控制器体质、主板供电与布线设计、BIOS未开启XMP/DOCP及内存自身兼容性等多因素共同作用所致,需通过正确设置与调优解决。 你是不是也遇到过,满心欢喜地插上高频内存,结果BIOS里一看,还是那个熟悉的2133MHz或2400MHz?那种感觉,就像买了一…

    2026年8月28日
    200
  • 抖音否认入局外卖:聚焦在到店业务上,没有自建外卖的打算

    7 月 18 日消息,上个月有网友发现字节跳动的用户增长团队推出了一款名为「探饭」的美食推荐类 ai 产品,随后又对“随心团”业务进行了调整,引发了外界对抖音是否要进军外卖行业的猜测。 针对抖音上线团购版外卖的传闻,抖音方面回应 36 氪表示,抖音生活服务专注于到店业务,目前没有自建外卖的计划。 据…

    2026年8月28日
    100
  • 如何登录路由器后台系统 路由器页面登录地址总汇

    要登录路由器后台,需在浏览器输入网关地址如192.168.1.1,该地址可从路由器标签或电脑命令提示符中通过ipconfig查看“默认网关”获取;输入正确用户名和密码(常见默认为admin/admin或查看标签)即可登录;若无法打开,检查网络连接、IP是否被修改或尝试更换浏览器;密码错误时可尝试默认…

    2026年8月28日
    100
  • linux是什么文件

    linux是什么文件? Linux是一种自由和开放源码的类UNIX 操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布,在加上用户空间的应用程序之后,成为 Linux 操作系统。 Linux 也是自由软件和开放源代码软件发展中最著名的例子。只要遵循 GNU 通用公共许可证(GP…

    2026年8月28日
    100
  • 华硕灵耀 14 双屏评测:一台行走的 20 吋显示器!

    华硕灵耀 14 双屏评测:一台行走的 20 吋显示器!华硕灵耀 14 双屏评测:一台行走的 20 吋显示器!华硕灵耀 14 双屏评测:一台行走的 20 吋显示器!华硕灵耀 14 双屏评测:一台行走的 20 吋显示器!

    目前致力于探索笔记本电脑新形态的厂商寥寥无几,华硕便是其中之一。华硕近十年来一直在努力让用户顺利从传统笔记本过渡到双屏笔记本,他们不仅推出各种形态的双屏笔记本,还不断优化产品交互,深入挖掘多屏笔记本的实际价值。 2024年,华硕推出了华硕灵耀14双屏笔记本,配备全球首款双14英寸OLED 120Hz…

    2026年8月27日 用户投稿
    100
  • 海棠书屋热门小说地址网_海棠书屋无广告免费言情小说入口

    海棠书屋热门小说地址网是https://www.haitangshuwu.com,该平台收录大量言情、玄幻、悬疑等类型小说,支持多种筛选方式与个性化阅读设置,提供流畅且无广告的阅读体验。 海棠书屋热门小说地址网在哪里?这是不少书迷朋友都关注的,接下来由PHP小编为大家带来海棠书屋无广告免费言情小说入…

    2026年8月27日
    200

发表回复

登录后才能评论
关注微信