linux 进程间通信之消息传递

(王道408考研操作系统)第二章进程管理-第一节4:进程间通信(配合Linux讲解) 文章目录一:什么是进程通信二:如何实现进程间通信及其分类三:通信方式1-共享存储(共享内存)(1)课本基础内容(2)补充-Linux中的进程通信四:通信方式2-管道(1)管道是什么(2)匿名管道A:读端和写端B:建立匿名管道的函数C:最简单的进程间通信-演示D:管道四大特性E:管道的特点F:从内核角度理解管道G:管道总结(3)命名管道A:命名管道和匿名管道的区别B:如何创建命名管道C:演示-管道实现服务端和客户端的通信五:通信方式3-消息队列 一:什么是进程通信 “微信想要获取手机存储权限”这就是一个典型的 阅读详情

from:http://www.cppblog.com/tankzhouqiang/archive/2011/07/07/150362.html

linux 进程间通信中消息传递主要分为管道,FIFO,消息队列

(1)管道
管道由pipe函数创建,提供一个单路(单向)数据流。pipe函数返回两个文件描述符:fd[0]和fd[1]。前者打开来读,后者打开来写。管道没有名字,所以只能由有亲缘关系的进程使用。尽管管道是由单个进程创建的,它却很少在单个进程内使用。管道的典型用途为两个不同进程(一个是父进程,一个是子进程)提供进程间的通信手段。首先,由一个进程(它将成为父进程)创建一个管道后调用fork派生一个自身的副本。接着,父进程关闭这个管道的读出端,子进程关闭同一管道的写入端。或者父进程关闭这个管道的写入端,子进程关闭同一管道的读出端。这就在父子进程间提供了一个单向数据流。

(2)FIFO
FIFO指代先进先出(First in,First out),linux中的FIFO类似管道。它是一个单向(半双工)数据流。不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。FIFO也称为有名管道。FIFO由mkfifo函数创建。其中pathname是一个普通的Unix路径名,它是该FIFO的名字。mkfifo 函数已隐含指定 O_CREAT|O_EXCL. 也就是说,它那么创建一个新的FIFO,要么返回一个EEXIST错误(如果所指定的名字的FIFO已经存在)。如果不想希望创建一个新的FIFO,那就改为调用open而不是mkfifo.要打开一个已存在的FIFO或创建一个新的FIFO,应先调用mkfifo,再检查它是否返回EEXIST错误,若返回该错误则改为调用open.mkfifo 命令也能创建FIFO。可以从shell脚本或命令行中使用它。在创建出一个FIFO后,它必须或者打开来读,或者打开来写,所用的可以是open函数,也可以是某个标准I/O打开函数。FIFO不能打开来既读又写,因为它是半双工的。对管道或FIFO的write总是往末尾添加数据,对它们的read则总是从开头返回数据。如果对管道或FIFO调用lseek,那就返回ESPIPE错误。

(3)Posix 消息队列
消息队列可认为是一个消息链表。有足够写权限的线程可往队列中放置消息,有足够读权限的线程可从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先级。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。这跟管道和FIFO是相反的,对后者来说,除非读出者已存在,否则先有写入者是没有意义的。一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后某个时刻读出这些消息。消息队列具有随内核的持续性,这跟管道和FIFO不一样。Posix消息队列和System V消息队列。这两组函数间存在许多相似性,但也有主要的区别
1. 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任意指定优先级的消息。
2.当往一个空队列放置一个消息时,Posix 消息队列允许产生一个信号或启动一个线程。System V消息队列则不提供类似机制。

队列中的每个消息具有如下属性:
1.一个无符号整数优先级(Posix)或一个长整数类型(System V).
2.消息的数据部分长度(可以为0).
3.数据本身(如果长度大于0)

函数接口
1. mqd_t mq_open(const char *name,int oflag,...)
mq_open函数创建一个新的消息队列或打开一个已存在的消息队列
2.int mq_close(mqd_t mqdes);
mq_close函数关闭一个消息队列。
3.int mq_unlink(const char *name);
从系统中删除用作第一个参数的某个name.
4. int mq_getattr(mqd_t mqdes,struct mq_attr *attr);
   int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *oattr);
每个消息队列有四个属性,mq_getattr返回所有这些属性,mq_setattr则设置其中某个属性。
struct mq_attr{
   long mq_flags;
   long mq_maxmsg;
   long mq_msgsize;
   long mq_curmsgs;
};
5.int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);
 int mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);
mq_send函数往消息队列中写入消息,mq_receive函数从消息队列中读出消息。

6.int mq_notify(mqd_t mqdes,const struct sigevent *motification);
结构体:
union sigval{
    int sival_int;
    void *sival_ptr;
};

struct sigevent
{
    int sigev_notify;
    int sigev_signo;
    union sigval sigev_value;
    void  (*sigev_notify_function)(union sigval);
    pthread_attr_t *sigev_notify_attributes;
};
mq_notify函数为指定队列建立或删除异步事件通知。一些普遍适用于该函数的若干规则
1).如果notification参数非空,那么当前进程希望在一个消息达到所指定的先前为空的队列时得到通知。我们说"该进程被注册为接收该队列的通知"。
2).如果notification参数为空指针,而且当前进程目前被注册为接收所指定队列的通知,那么已存在的注册将被撤销。
3).任意时刻只有一个进程可以被注册为接收某个给定队列的通知。
4).当有一个消息达到某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有在没有任何线程阻塞在该队列的mq_receive调用中的前提下,通知才会发出。这就是说,在mq_receive调用中的阻塞比任何通知的注册都优先。
5).当该通知被发送给它的注册进程时,其注册即被撤销。该进程必须再次调用mq_notify以重新注册(想要的话)。

参考:Unix进程间通信

进程间通信(消息传递机制) 进程间通信基本的基本知识 postmessage和sendmessage 立即下载

相关推荐

线程间通信方式3:消息传递方式

线程间通信方式3:消息传递方式的演示。采用计算演示线程的执行,并采用用户界面线程来实时显示执行的进度,线程间的通信方式采用了3种方式相结合,对多线程间的通信有比较好的学习和研究价值。

Linux — 进程间通信

通信就是一个人通过某种方式向另一个人传输信息,那么什么是进程间通信?进程间通信就是一个进程向另一个进程传输信息。大家都知道进程是具有独立性的,那进程之间要通信,这个成本一定不低,为什么呢?因为进程的很多设计都是按照独立性展开的。那么进程间通信的目的是什么?

一个努力拼搏的人 533

实验10 进程间通信

实验10 进程间通信

Linux学习笔记之进程间通信篇(3)_消息传递

正式进入进程间通信了,本节主要介绍下消息传递的相关概念和用法,分为管道与消息队列。

979 2199

Unity中USD场景导入与工业级协作实战指南

USD(Universal Scene Description)是一种面向复杂三维场景的结构化数据模型,其核心在于分层描述、变体管理与非破坏性组合,本质是支持多团队并行协作的场景协议。它不同于传统模型格式,强调运行时可编辑性与版本可控性,技术价值体现在跨软件资产一致性、零拷贝动态叠加及内存中实时合成。典型应用场景包括建筑BIM实时漫游、汽车多配置仿真、影视级灯光材质协同等工业管线。在Unity中,USD已深度集成于URP/HDRP管线,通过原生USD Importer、Runtime与Exporter三组件

weixin_32073537的博客 301

雨流计数法的matlab实现,采用三点法与四点法

介绍雨流计数法是20世纪50年代由英国的两位工程师M.Matsuishi和T.Endo提出来的。该计数法的主要功能是把实测载荷历程简化为若干个载荷循环,供疲劳寿命估算和编制疲劳试验载荷谱使用。它以双参数法为基础,考虑了动强度(幅值)和静强度(均值)两个变量,符合疲劳载荷本身固有的特性。雨流计数法主要用于工程界,特别在疲劳寿命计算中运用非常广泛计数规则(1)雨流依次从载荷时间历程的峰值位置的内侧沿着...

u011391128的博客 3万+

操作系统-进程间的四种通信(共享内存、消息队列、信号、管道)

操作系统-进程间的通信-共享内存-消息队列-信号-管道

weixin_64612849的博客 1889

COMSOL解的继承

COMSOL解的继承1. 应用场景2. 实现方法2.1. 添加研究步骤2.2. 引用研究 根据参考文献整理而来,原文见: http://blog.sina.com.cn/s/blog_4a0a8b5d010126w5.html https://www.zhihu.com/question/371867999/answer/1309194094 个人学习笔记,如有疏漏,欢迎补充 1. 应用场景 在COMSOL模拟中,一次求解之后往往遇到以下几种情况需要用到解的继承: 1)瞬态求解的继续运算。例如初始设定求解1

jessica0307的博客 1万+

Linux系统-----进程通讯

本期我们来学习进程间的通讯一、信号机制1、信号的基本概念每个信号都对应一个正整数常量称为即信号编号。定义在系统头文件中,代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一种模拟,故在早期的UNIX版本中又把它称为软中断。

m0_73633088的博客 1372

21、汽车喷漆目标区域识别:机器学习与深度学习的应用

本文探讨了机器学习与深度学习在汽车喷漆目标区域识别中的应用,重点利用卷积神经网络(CNN)提高喷漆效率并减少油漆浪费。通过构建和预处理包含多种汽车类型的数据集,采用ResNet-18、ResNet-50和MobileNet-v2等模型进行训练与评估,结果表明ResNet-50在准确率和鲁棒性方面表现最佳。研究还分析了数据裁剪、标签处理、网络架构差异以及光照和遮挡对识别效果的影响,并提出了系统实现流程。最后,文章展望了多传感器融合、模型优化和场景适应性等未来研究方向,为智能化喷漆工艺提供了技术参考。

5b6n7m8的博客 102

将MathType、zotero嵌入Word、WPS

最近也是慢慢学起了写文稿之类的内容,在写论文的时候,肯定会遇到一些数学公式的插入,如果使用wps、word等自带的插入公式,一般不符合投稿期刊的格式要求,而且不方便、不美观,故开始研究MathType 这款插入公式的工具。

2401_83617940的博客 2276

2.1.4 进程之间的通信(共享通信、消息传递、管道通信)

1 思维导图 进程通信分为共享内存、管道通信、消息传递 (1)共享内存:要互斥地访问共享空间; (2)管道通信: 一个管道只能实现半双工通信; 写满时,不能再写,读空时,不能再读; 没写满,不能读,没读空,不能写。 (3)消息传递 2进程通信 图中我们可以知道什么是进程通信,以及进程通信的低级和高级方式; 我们还可以知道为什么要引入进程通信方式,以及它的意义 进程通信就是进程之间的信息交换。 2.1共享存储 共享一块大家...

StudyWinter的博客 3119

【Linux】软件控制USB重新上电、加载:usbreset、hubpower、uhubctl

使用命令控制USB的供电、复位

郭老二 2187

linux消息传递 隐藏数据库,linux进程间通信之消息传递

linux进程间通信之消息传递(2014-12-12 00:46:51)标签:健康美食旅游情感linux进程[url=http://guba.eastmoney.com/news,000001,96192789.html]婴儿奶粉哪种好[/url]间通信中消息传递主要[url=http://bbs.ifeng.com/viewthread.php?tid=16608241]进口婴儿奶粉排行榜[/u...

weixin_28752709的博客 120

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 218

基于大语言模型的多轮对话系统优化研究

基于大语言模型的多轮对话系统优化研究 摘要 本研究针对大语言模型在多轮对话场景中的性能衰减问题,提出了一套系统优化方案。通过分层存储架构(短期记忆层、中期摘要层、长期知识层)和混合检索策略优化上下文管理,设计动态槽位填充框架增强对话状态跟踪,引入熵引导的重置算法改进生成策略,并采用双路径加载架构突破I/O瓶颈。实验表明,该方案使任务完成率提升28.6%,响应一致性提高41.2%,推理延迟降低35.8%,为构建高性能智能对话系统提供了实用技术路径。 关键词:大语言模型;多轮对话;上下文管理;状态跟踪~~~~~

huanghm88的专栏 663

linux进程间通信之消息传递

linux 进程间通信中消息传递主要分为管道,FIFO,消息队列 (1)管道 管道由pipe函数创建,提供一个单路(单向)数据流。pipe函数返回两个文件描述符:fd[0]和fd[1]。前者打开来读,后者打开来写。管道没有名字,所以只能由有亲缘关系的进程使用。尽管管道是由单个进程创建的,它却很少在单个进程内使用。管道的典型用途为两个不同进程(一个是父进程,一个是子进程)提供进程间的通信手段。首

daimaocongryi的专栏 942

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux进程间通信时间,linux 进程间通信之消息传递

linux 进程间通信中消息传递主要分为管道,FIFO,消息队列(1)管道管道由pipe函数创建,提供一个单路(单向)数据流。pipe函数返回两个文件描述符:fd[0]和fd[1]。前者打开来读,后者打开来写。管道没有名字,所以只能由有亲缘关系的进程使用。尽管管道是由单个进程创建的,它却很少在单个进程内使用。管道的典型用途为两个不同进程(一个是父进程,一个是子进程)提供进程间的通信手段。首先,由一...

weixin_35989968的博客 259

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux进程间通知,linux 进程间通信之消息传递

5.int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);int mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);mq_send函数往消息队列中写入消息,mq_receive函数从消息队列中读出消息。6.int mq_notify(...

weixin_33896830的博客 401

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux IPC进程间通信_消息传递_内核源码分析

Linux IPC消息队列的分析 ——Linux源码解读报告 注:转载自:http://zhoutall.com/archives/383 推荐一个查看linux内核源码的网站:http://lxr.free-electrons.com/ident 一. Linux IPC简介   Linux IPC主要包括四个部分:最初UNIX IPC、System V IPC

kipdoudou的专栏 1607

Linux系统中存在的各种进程间通信机制

前面我们对进程间通信的本质和框架有了基本的了解,下面我们来简单介绍一下Linux中的所有进程间通信机制。我们先来看一下总图。我们先把这张图简介浏览一下。首先从大类上分,进程间通信方法可以分为3类,消息传递式、共享内存式、进程间同步。为啥这里会有进程间同步呢?进程间同步是为了同步两个进程对共享内存的读写,进程间同步也算是在两个进程间传递了信息,所以把进程间同步也放在了进程间通信中。可以看到共享内存式机制比消息传递式机制要少,我们就先介绍共享内存式。

多媒体开发者 572

论Linux进程间通信

例如,在使用管道进行通信时,进程需要明确知道哪个文件描述符是用于读,哪个是用于写,以及在读写过程中的各种规则和特殊情况的处理。通过一幅图来解释进程间通信的原理,可以看到,尽管进程之间有空间隔离,但它们都与内核相连,可以通过特殊的系统调用与内核进行沟通,从而实现与其他进程的通信。在操作系统中,内核空间是所有进程共用的,而每个进程都拥有自己的用户空间。例如,在使用共享内存进行进程间通信时,用户通过特定的系统调用接口(通信接口)请求内核空间的通信中枢为其分配一块共享内存区域,并建立起不同进程对该区域的访问路径。

循环渐进学习编程,成长 2335

linux进程间通信综述

linux进程间通信综述 linux进程间通信主要分为以下4个领域 (1)消息传递(管道,FIFO,消息队列) (2)同步(互斥锁,条件变量,读写锁,信号量) (3)共享内存区(匿名共享内存区,有名共享内存区) (4)过程调用(Solaris门,Sun RPC)

风之子的专栏 3653
上一篇: Android移动网络设置
下一篇: c++小时钟
Qicz
博客等级 码龄16年 56粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值