您好、欢迎来到现金彩票网!
当前位置:秒速牛牛开奖 > 同步通信量 >

进程间通信:管道、消息队列、信号量、共享内存

发布时间:2019-08-09 03:48 来源:未知 编辑:admin

  进程是一个独立的资源分配单元,不同的进程之间的资源是独立的,不能在一个进程中直接访问另一个进程的资源。

  但是,进程并不是独立的,不同的进程间需要信息的交互和状态的传递等。因此需要进程间通信(IPC: Inter Process Communication)。

  (1) 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端;

  (2) 它只能用于具有亲缘关系的进程之间(也就是父子进程或者兄弟进程);

  (4) 管道可以看成是一种特殊的文件,但是不属于文件系统,只存在于内存中,对它的读写可以使用普通的read、write函数。

  当一个管道建立时,它会创建两个文件描述符,fd[0]为读打开,fd[1]为写打开。

  默认情况下,从管道中读写数据,最主要的特点就是阻塞的问题,当管道里没有数据,另一个进程默认用read()函数从管道中读数据是阻塞的。当然,我们在编程的时候可以通过fcntl()函数设置文件的阻塞属性:

  默认情况下,当管道的读端口都关闭时,在向管道中write(),write的进程会收到SIGPIPE信号,默认会终止当前write的进程

  (1) 与pipe是只有亲缘关系的进程才可以使用不同,FIFO提供了一个路径与值关联,只要进程能够访问该路径,所以,FIFO可以实现不相关的进程之间的通信;

  (2) FIFO也是一种存在于内存中的特殊文件,而且进程退出后该文件不会被删除;

  (1) 没有指定O_NONBLOCK(默认),只读open要阻塞等到其他进程为写打开此FIFO。同理,只写open要阻塞等倒其他进程为读打开此FIFO。与pipe相同,当FIFO中无数据可读是,read会阻塞;

  消息队列是消息的链表,存放于内核中。一个消息队列由一个标识符(即队列ID)来标识。

  (2) 与管道和命名管道一样,从消息队列中读出消息,相应的数据会从消息队列中删除;

  (4) 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取。

  1. 如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位;

  3.type 0,返回消息队列中小于或等于type绝对值的消息。

  消息类型必须是长整型的,而且必须是结构体的第一个成员,类型下面是消息正文,正文可以有多个成员(正文成员可以是任意数据类型的)。至于这个结构类型叫神马名字,里面成员叫什么名字,没有明确规定,自行定义。

  服务端程序一直在等待特定类型的消息,当收到该类型的消息之后,发送另一类型的消息作为反馈,客户端读取该反馈消息并打印。

  信号量与已经介绍的IPC结构不同,它是一个计数器。信号量用于实现进程或线程间的互斥与同步,而不是用于存储进程间通信数据。

  编程时可根据信号的值判断对公共资源的访问权限,当信号量值大于0时,则可以访问。PV原语对信号量进行操作,P减1,V加1。

  信号量也分无名信号量和有名信号量。无名信号量一般用于线程间同步或互斥,有名信号量一般用于进程间同步或互斥。它们的区别和管道和有名管道一样,无名信号量直接保存在内存中,有名信号量则创建一文件。

  共享内存是进程间通信最简单的方式,它允许两个或者更多的进程访问同一个内存,当这一块内存改变的时候,其他进程都会立刻感知到。

  (1) 共享内存是进程间共享数据最快的一种方式,因为是直接对内存进行操作;

  /*key: 键值,ftok()函数的返回值 * size: 共享内存大小(字节) * shmflag: 标识函数的行为及权限 *IPC_CREAT: 如果不存在就创建 *IPC_EXCL: 如果存在就返回失败 *位或者权限位: 和open()函数使用一样 * * 成功:共享内存标识符, 失败:-1 */

  /*简单来说,就是让进程的某个指针指向此共享内存 * shmid: 共享内存标识符,shmget()的返回值 * shmaddr: 共享内存映射地址,推荐使用NULL,由系统自动指定 * shmflg: 共享内存段的访问权限和映射条件(通常为0): *0: 可读写 * SHM_RDONLY: 只读 * SHM_RND: (shmaddr非空时才有效) * * 成功:共享内存段映射地址(相当于这个指针就指向此共享内存), 失败:-1 */

  /*shmid: 共享内存标识符 * cmd: 函数的控制 *IPC_RMID: 删除 * IPC_SET: 设置shmid_ds参数,相当于把共享内存的属性替换成buf里的属性 * IPC_STAT: 保存shmid_ds参数,把共享内存的属性备份到buf中 * SHM_LOCK: 锁定共享内存段(超级用户),只是禁止虚拟内存的交换,并不是禁止其他的进程访问,这样的优势在于让共享内存一直处于内存中 * SHM_UNLOCK: 解锁共享内存段 * * 成功:0, 失败:-1 */

  1.无名管道简单方便,但局限于单向通信的工作方式,并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

  2.消息队列可以不再局限于父子进程,而允许任意进程通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接收之间的同步,从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题,使用方便,但是信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

  3.共享内存针对消息队列的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的。因此,这些进程之间的读写操作的同步问题操作系统无法实现,必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。

  进程间通信:进程之间的沟通交流进程间为什么要沟通交流?在实际工作中往往会出现在一个系统中好几个进程协同工作,那么这些进程就需要沟通交流,完成协作,而由于进程的独立性,进程间的沟通变得困难,复杂。因此就...博文来自:sophia__yu的博客

  /*1,进程间通信(IPC)Inter-ProcessCommunication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。2,linux下IPC机制的分类:管道、信号、共享内...博文来自:数学物理方法

  目录进程间通信的介绍管道匿名管道原理:代码实现匿名管道特性实现管道符 命名管道命名管道特性代码实现管道读写规则操作系统中ipc的相关命令共享内存(重点)生命周期:代码实现代码实现获取数据消息队列信号...博文来自:W_J_F_的博客

  2017/11/4进程间通信,进程池进程间通信(IPC,inter-processcommunication):生产进程生产食物,消费进程购买食物,消费进程一直监视生产状况,只要一有食物就将其取出来,...博文来自:sinat_27864123的博客

  一、进程间通信的目的因为进程的地址空间都是相互独立的,为了实现进程间的数据传输、资源共享、进程控制(如gdb调试)、通知事件等二、进程间通信的方式进程间通信的方式有非常多种,本文仅介绍管道中的匿名管道...博文来自:jane_yao的博客

  进程间通信的本质是让两个不相干的进程看到同一份资源。这个资源是由操作系统提供的一个文件。进程间通信的目的:1.数据传输:一个进程需要将它的数据发送给另一个进程。2.资源共享:多个进程之间共享同样的...博文来自:weixin_36229332的博客

  IPC是进程间的通信(interprocesscommunication)的简称。传统上该术语描述的是运行在某个操作系统上的不同的进程间各种消息传递(messagepassing)。IPC分为两代,初...博文来自:染尘

  需求如下:当配置文件发生改变时,广播配置信息给所有的进程,通知其重装配置.   1.WM_COPYDATA传递消息  windows下最简单进程通信方式,利用WM_COPYDATA事件,该事件能够...博文来自:specialsun的专栏

  消息队列·消息队列提供了从一个进程向另一个进程发送一块数据的方法;·每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值;·消息队列也具有管道的缺点,即每个消息的最大长度是有上限的...博文来自:summer初夏的博客

  (一)信号量信号量是IPC的一种,可以看做是一个计数器,计数值为可用的共享资源的数量,信号量可用于多进程的同步,为多个进程提供对共享资源的访问。linux下的信号量的接口函数如下:/*(1)获取信号量...博文来自:poetteaes的博客

  unix,linux,进程间通信IPC机制,管道,消息队列,共享内存 unix,linux,进程间通信IPC机制,管道,消息队列,共享内存 unix,linux,进程间通信IPC机制,管道,消息队列,共享内存

  详细讲述了进程间通信的机制 包括: 管道和FIFO 消息队列 共享内存 信号量等等

  linux进程间通信方式--管道、信号量、消息队列、共享内存的介绍,以及与这些方式相关的函数讲解。

  主要讲述Linux 进程间通信机制的分析比较 包括信号管道和命名管道 信号量 消息队列 共享内存

  共享内存共享内存是最快的进程通信方式。因为不同于消息队列和管道,需要调用内核函数切换运行环境,而是直接在自己进程的虚拟地址空间里操作。创建或打开共享内存intshmget(key_tkey,intsi...博文来自:漫鱼

  找了很久也没有找到NSPipe在IOS方面的常规使用()。我试了半天终于找到它的正常的使用方法,我想对很多想使用管道会有很大的帮助。阿门,看来我是第一吃螃蟹的人。进程和线程间四大通信机制:管道,信号量...博文来自:jia12216的专栏

  一、信号量:用于管理对资源的访问。二、共享内存    共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个物理内存区域...博文来自:这世界缤纷多彩

  有名信号量和共享内存实现同步聊天共享内存是最为高效的进程间通信方式,可直接读写内存,不需要任何数据的拷贝,因此效率高。共享内存创建步骤:1、创建或打开共享内存 shmget函数实现2、映射共享内存  ...博文来自:wx_666_的博客

  1.进程间通信Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。2.2.1管道管道是进程间通信中最古老的方式,它包括无名管道...博文来自:ljp1919的专栏

  消息队列之前我们解析了一下进程间通信的管道通信,今天我们来看一下另外俩种通信方式:消息队列和共享内存。那什么是消息队列呢?之前我们说管道在进程间通信的时候是基于字节流的,而消息队列在进程间通信的时候是...博文来自:Beginner_zero的博客

  临界资源:具有排他性的资源临界区:访问临界资源的代码段信号量的本质就是计数器互斥访问 操作系统的P操作就是上锁,V操作就是解锁上锁()                          解锁() { ...博文来自:enjoymyselflzz的博客

  1.背景本文将介绍进程通信中的共享内存,信号量和套接字方法。2.共享内存共享内存是最快的IPC(进程间通信)方式。共享内存是一个程序向内存写数据,另一个程序读数据,共享内存牵扯到同步的问题,一般有三种...博文来自:ljp1919的专栏

  今天,给大家来在父子间使用共享内存实现通信,使用信号实现同步。  1.进程的创建     1)对于进程的创建,使用的函数为fork();       函数原型为pid_tfork(void);    ...博文来自:xld_hung的博客

  前言今天我们讨论进程之间的通信,利用管道(pipe)和共享内存(sharememory)实现数据流通。1.管道(pipe)管道是最古老也是最容易理解的通信方式,它有两个限制一个管道只能在一个方向上传送...博文来自:润润哥的博客

  共享内存、消息队列、信号量之ipcs命令详解博文来自:scott_bing的专栏

  常用的IPC分为两个类别,一是基于文件,而是基于内存基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件基于内存的有普通内存共享(本文章没有介绍),共享内存,共享信号量,消息队列本文就...博文来自:朝气蓬勃

  进程间通信-共享内存amp;信号量一.共享内存1.简单介绍    (1)共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不再涉及内核,即进程不再通...博文来自:Lycorisradiata__的博客

  在一个大型的应用系统中,往往需要多个进程相互协作,进程间通信(IPC,InterProcessCommunication)就显得比较重要了。在Linux系统中,有很多种IPC机制,比如说,信号(sig...博文来自:面目全非,胸有丘壑 Json Lee

  无名管道无名管道是半双工的,只能读或者写;无名管道只能在相关的,有共同祖先的进程间使用;一个fork()或者exec()调用创建的子进程继承了父进程文件描述符;打开和关闭管道:intpipe(intf...博文来自:慎薇的博客

  消息队列、共享内存、信号量这三个放到一起说是因为这三种机制统称为“系统V进程间的通信机制”,系统为VIPC提供了一个统一的系统调用ipc(),内核的实现是sys_ipc()。 intsys_ipc(u...博文来自:的博客

  每一个进程都有着自己独立的地址空间,比如程序之前申请了一块内存,当调用fork函数之后,父进程和子进程所使用的是不同的内存。因此进程间的通信,不像线程间通信那么简单。但是共享内存编程接口可以让一个进程...博文来自:无名小鱼

  消息队列消息队列的结构有很多,但在这里讲的队列的结构都是基于链表实现的.进程间通信的实质是:让不同的进程可以看到相同的资源.消息队列的特点:消息队列的通信是通过发送有类型数据块的方法.每个数据块都有一...博文来自:Yinghuhu333333的博客

  进程间通信之管道,点击这里:消息队列:消息队列是一种进程间发送二进制数据块的机制,每个...博文来自:YANG

  Linux中进程之间通信有,pipe,signal,消息队列,共享内存,信号量,socket.Qt中提供的进程间通信有如下几种:1.TCP/IP跨平台的QNetwork提供了众多的类来实现网络编程.比...博文来自:Herok

  管道从一个进程连接数据流到另一个进程时,使用管道(pipe)。通常是把一个进程的输出通过管道连接到另一个进程的输入。管道是半双工的,数据只能单向。管道可分为有名管道和无名管道,有名管道:可以在任意进程...博文来自:hhhanpan的博客

  接上一篇文章一、引言此问题是操作系统中的一个经典的同步异步问题,是我们操作系统课程中非常重要的一部分。实验要求我们用C语言在Linux操作系统下利用信号量函数和共享内存函数实现经典的生产者消费者问题。...博文来自:的博客

  linux常见IPC方式有:管道,有名管道,信号量,消息队列,共享内存,socket套接字。共享内存是最快的IPC方式。本文是具体别称实现共享内存的IPC,一个程序向内存写数据,另一个程序读数据,共享...博文来自:水滴石穿

  一、管道通信,共享内存,消息队列,信号通信是进程间通信方式。信号量是进程间同步的机制。进程间通信的原因:数据传输,资源共享,通知事件,进程控制。二、管道通信(1)管道是单向的、先进先出的,它把一个进程...博文来自:DC1275188119的博客

http://4kci.com/tongbutongxinliang/578.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有