首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux进程间通信(上)之管道、消息队列实践

1、进程间通信简述 进程间通信的几种方式:无名管道、有名管道、消息队列、共享内存、信号、信号量、套接字(socket)。 进程间通信是不同进程直接进行的一些接触,这种接触有简单,有复杂。...管道是Linux支持的最初Unix IPC形式之一,管道与管道之间通信其实就是一个文件,但它不是一个普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统而且只存在内存中。...我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。...造成msgsnd()等待的条件有两种:当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;当前消息队列的消息数不小于消息队列的总容量,此时,虽然消息队列中的消息数目并不多,但基本上都只有一个字节...消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点,相对于管道通信有很大的改观,而且消息队列对数据的顺序处理也是非常有条理性的不会产生混杂性。

2.4K10

Linux 下的进程间通信:使用管道和消息队列

本篇是 Linux 下进程间通信(IPC)系列的第二篇文章。第一篇文章 聚焦于通过共享文件和共享内存段这样的共享存储来进行 IPC。这篇文件的重点将转向管道,它是连接需要通信的进程之间的通道。...在 Linux 系统中, PIPE_BUF 的大小是 4096 字节。对于管道我更喜欢只有一个写入方和一个读取方,从而绕过这个问题。...正如它的名字所提示的那样,消息队列是一系列的消息,每个消息包含两部分: 荷载,一个字节序列(在 C 中是 char) 类型,以一个正整数值的形式给定,类型用来分类消息,为了更灵活的回收 看一下下面对一个消息队列的描述...假如按照严格的 FIFO 行为执行,消息将会以 1-2-2-3 这样的次序被接收。但是消息队列允许其他收取次序。例如,消息可以被接收方以 3-2-1-2 的次序接收。...输出也显示消息队列是持久的,即便 sender 进程在完成创建队列、向队列写数据、然后退出的整个过程后,该队列仍然存在。

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    ,他还有许许多多的模块,比如终端处理,以及我们现在所学的通信模块,如果提供的是一大块内存,我们称之为共享内存通信机制,如果是一个计数器,我们称为信号量的机制,如果是一个队列,我们称为消息队列的机制。...四、System V 消息队列(了解) 1.消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 2.每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3.IPC资源必须删除...,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 内核也给我们提供了获取消息队列和控制消息队列的系统接口 4....消息队列通常由两个组件组成:生产者和消费者。生产者将消息发送到队列中,消费者从队列中读取消息并进行处理。...消息队列软件可以提供许多有用的功能,例如消息确认、消息分组、消息过期时间等等 下面是消息队列的数据发送和接收接口。 五、System V 信号量(了解) 1.信号量是什么?

    1.5K40

    Linux消息队列

    什么是消息队列 消息队列可以分为队列和消息 队列 队列是从开始到结束,有序的排放消息。消息队列是用来在应用程序发送消息,队列中存放了一些待处理的消息。...消息队列的基本结构是简单的,有一个客户端应用程序称为生产者,创建消息,并将它们传送到消息队列。其他应用程序,称为消费者,连接到队列,并得到要处理的消息。...消息队列API 创建新消息队列或取得已存在消息队列 #include ------------------------------------ int msgget(key_t...格式如下:msgsz消息的大小msgflgIPC_NOWAIT: 如果消息队列中没有数据,则立刻返回不用等待。MSG_NOERROR:如果消息队列长度大于msgsz,截断消息。...IPC_SET该命令用来设置消息队列的属性,要设置的属性存储在buf中。IPC_RMID从内核中删除 msqid 标识的消息队列。

    4.2K30

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    命名管道: 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。 命名管道是一种特殊类型的文件 我们可以使用mkfifo命令来创建一个管道。...然后通过echo往里面写入一段内容: 回车之后管道不会关闭,在终端2查看可以发现他的内存大小仍然是0,当我们在管道2打印出内容后,管道就自动关闭了 当我们这样执行的时候,我们就可以发现在一直不停的打印我们输入到管道的内容...system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列的接口的使用跟共享内存函数很像...如果要发消息队列的数据,用: 如果要接收数据,用: 要查消息队列就用 ipcs -q ,它的指令跟共享内存就一字之差 system V信号量 信号量主要用于同步和互斥的。...信号量的操作 Linux中允许用户一次申请多个信号量,用信号量集保存,信号量集用数组来维护。 如果申请了多个信号量,上面的nsems就是申请的信号量的个数。

    18210

    【Linux】进程间通信>管道&&共享内存&&消息队列&&信号量详解

    3.3.4 shmctl函数 3.4 实例代码 3.4.1 namedPipe.hpp 3.4.2 Shm.hpp 3.4.3 server.cc 3.4.4 client.cc 5.system V消息队列...System V进程间通信 POSIX进程间通信 1.3 进程间通信分类 1.3.1 管道 匿名管道pipe 命名管道 1.3.2 System V IPC System V 消息队列...System V 共享内存 System V 信号量 1.3.3 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 2.管道 2.1 什么是管道 管道是Unix...5.system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 特性方面 IPC资源必须删除,...在进程中涉及到互斥资源的程序段叫临界区 特性方面 IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 7.OS管理 操作系统如何把共享内存,消息队列,信号量统一管理起来

    18410

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    今日更新了Linux进程间通信的内容 欢迎大家关注点赞收藏⭐️留言 命名管道 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。...命名管道是一种特殊类型的文件 从命令行上创建 如上图,当我们在终端1创建了一个命名管道后,往里面写东西,管道不会关闭,在终端2上发现,它的内存大小还是0。...system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列的接口的使用跟共享内存函数很像...如果要发消息队列的数据,用 如果要接收数据,用 要查消息队列就用 ipcs -q ,它的指令跟共享内存就一字之差 system V信号量 信号量主要用于同步和互斥的。...信号量的操作 Linux中允许用户一次申请多个信号量,用信号量集保存,信号量集用数组来维护。 如果申请了多个信号量,上面的nsems就是申请的信号量的个数。

    22810

    Linux消息队列及函数

    消息队列的概念 消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述。...队列头中包含了该队列的大量信息,包括消息队列的键值、用户ID、组ID、消息数目、读写进程ID等。...在以下两种情况下,msgget()将创建一个新的消息队列: 如果没有消息队列与键值key相对应,且msgflg中包含了IPC_CREAT标志位 key参数为IPC_PRIVATE 消息队列的读写 消息队列传递的消息由两部分组成...消息队列中类型值小于type的绝对值的所有消息中类型值最小的那一条消息 消息队列属性设置 消息队列的信息基本都保存在消息队列头中,可分配一个类似于消息队列头的结构struct msqid_ds...参考: 《精通Linux C编程》- 程国钢 《Linux C编程完全解密》- 闫敬 吴淑坤

    4.8K20

    Linux内核编程--消息队列

    一,关于Linux中的IPC IPC的意思是“ 进程间通信机制”,Linux内核有三种常用IPC对象可以拿来做进程间通信--消息队列,共享内存,信号量。...这三种IPC对象在Linux内核中都以链表的形式存储,它们都有特定的ID来标识(消息队列标识符msqid、共享内存标识符shmid,信号量标识符semid)。...消息队列与其他进程通信机制的比较: 与信号量相比,消息队列可以承载更多的通信数据。 与管道的默认接收相比,消息队列可以让接收进程有选择地接收通信数据,还可以设置接收的优先级。...当使用消息队列的进程终止时,消息队列不会自动删除。但所有引用管道的进程终止时,管道会自动删除。 与共享内存相比,共享内存的速度更快,因为对共享内存的处理不经过内核调用,而消息队列需要经过内核调用。...(2)消息队列允许一个或多个进程写入或读取消息。 (3)消息队列的声明周期随内核。 (4)消息队列可以实现双向通信。

    4.5K20

    【Linux】消息传递的艺术:探索Linux消息队列机制

    本文所讲的共享内存为System V版的消息队列 大家好,我是Yui_,一位努力学习C++/Linux的博主~ 如果文章知识点有错误的地方,请指正!...分享给更多人:欢迎分享给更多对 Linux 感兴趣的朋友,一起学习!...与管道不同,消息队列不仅允许不同大小的数据块传递,还支持消息的优先级排序,从而提供了更灵活的通信机制。...1.1 消息队列的特点 异步通信:发送方和接受方不需要同时进行,消息会存储在队列中,直到接收方读取。 持久性:消息队列由内核维护,即使发送方或者接收方意外退出,消息仍然保留在队列中。...如果你没有看过我的共享内存文章,推荐一看,会对你理解消息队列也是有帮助的哦~ 【Linux】「共享内存揭秘」:高效进程通信的终极指南-CSDN博客 还是老样子,我们先创建一个共享区域:common.hpp

    21810

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

    常见的system V结构的通信方式有如下几种:共享内存、消息队列、信号量。管道什么是管道进程间通信层面,对于文件系统有基于文件系统的管道,那么管道是什么呢?...PIPE_BUF时,linux将不再保证写入的原子性管道特征管道的生命周期依托于进程。...消息按顺序插入队列中,其中发送进程将消息添加到队列末尾,接收进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。...发送进程把消息发送到队列尾部,接收进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。...消息队列的内核结构实际上操作系统中会有存在很多的消息队列,系统也必须为消息队列维护内核数据结构消息队列的数据结构如下:(注:结构体msqid_ds位于构 /usr/include/linux/msg.h

    2K00

    进程间通信的方式——信号、管道、消息队列、共享内存

    命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 4. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。...消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 5....管道是Linux 支持的最初Unix IPC形式之一,具有以下特点: 1) 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2) 匿名管道只能用于父子进程或者兄弟进程之间(...消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。...消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。

    29810

    Linux进程间通信 消息队列

    消息队列 是消息的链接表,存储内核中,由消息标识符标识。 --《UNIX环境高级编程》 简单理解,消息队列就是一堆消息的有序集合,并缓存于内核中。...,其中cmd指进行的操作,buf记录了消息队列的信息。...总结 消息队列在进程间通信的优势总结起来有以下几点: 缓存:数据较大的消息处理起来时间较长,此时将其写入消息队列更快,待系统空闲时再处理。提高系统任务执行效率。...送达:消息队列存储的消息,会一直保留在队列中直到消息被处理,且被取走后就会被队列释放。因此无论多少个进程在获取,每个消息仅会被处理一次。 排序:消息在队列中一直按照“先入先出”的顺序来执行。...异步:消息队列因为会缓存消息,且顺序处理不会丢失。因此多个进程可通过消息队列实现异步通信,互不阻塞。

    4.6K40

    Linux进程通信之消息队列

    Linux进程通信之IPC消息队列 首先消息队列是存放消息的队列,而队列则是一种先进先出的数据结构。...、msg_stat_queue 具体的相关参数以及介绍,请查看PHP手册及相关文档 PHP手册之IPC 不同进程间消息队列通信 写进程demo21.php //根据一个存在的文件和标识生成消息队列的key...$key = ftok('demo21.php','a'); //创建消息队列 $msgId = msg_get_queue($key); //向消息队列中发送消息 msg_send($msgId...key $key = ftok('demo21.php','a'); //创建消息队列 $msgId = msg_get_queue($key); //接收消息队列消息 msg_receive($msgId...父子进程消息队列通信 假设是子进程接收,父进程发送 $key = ftok('demo23.php','a'); //获取消息队列 $msgId = msg_get_queue($key);

    2.7K20

    PHP进程通信之管道与消息队列(二十三节)

    -- 消息队列 这个怕是很多人都听过,不过印象往往停留在kafka、rabbitmq之类的用于业务解耦的网络消息队列软件上。...然而这里的消息队列是说操作系统中内置的一种数据结构,消息队列是消息的链接表(一种常见的数据结构),但是这种消息队列存储于系统内核中(不是用户态),一般我们外部程序使用一个key来对消息队列进行读写操作,...这种消息队列的状态是由操作系统来维护的,每个消息队列在操作系统内部都有一个标志符,但是这种标志符是操作系统内部使用的,在外我们使用的则是消息队列的ID或者KEY,而这个ID或KEY的生成方式可以使用ftok...()函数;除此之外,既然这种消息队列是系统维护的,所以理论上只要外界程序知道这个消息队列的ID或KEY,那么跨语言之间也可以通过这个消息队列进行通信,比如使用PHP向消息队列中写入数据,使用Python...语言从消息队列中读取消息。

    1.4K31

    【Linux】责任链模式和消息队列

    一、概述 其实之前在 【Linux】 IPC 进程间通信(三)(消息队列 & 信号量) 也了解过相关知识,这里的话只是做个补充 消息队列 提供了一个 从一个进程向另外一个进程发送有类型块数据 的方法 每个数据块都被认为是有一个...类型,接收者进程接收的数据块可以有不同的类型值 消息队列 也有 管道 一样的不足,就是每个消息的最大长度是有上限的 (MSGMAX) 每个消息队列的 总的字节数 也是有上限的 (MSGMNB),系统上...六、接口说明及案例 这些接口之前在 【Linux】 IPC 进程间通信(三)(消息队列 & 信号量 有做了解,这里就简单阐述一下 1. msgget NAME msgget - get...(获取指定消息队列的当前状态和属性) IPC_SET 在进程权限足够的前提下,把消息队列的当前关联值设置为 msqid_ds 数据结构中给出的值(修改指定消息队列的属性) IPC_RMID 删除消息队列...,那么就注释一下 Server 的析构函数,再运行结果如下: 通过 ipcs -q 可以查看创建的消息队列,也可以类似于【信号量】使用将其删除,如下: 结论: 消息队列的生命周期是随内核的 消息队列支持全双工

    8910

    Linux进程间通信之消息队列

    一,消息队列 1,概念:“消息队列”是在消息的传输过程中保存消息的容器 2,消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。   ...对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;   对消息队列有读权限的进程则可以从消息队列中读走消息。   消息队列是随内核持续的。...3,编程注意事项:使用时先把数据封装成消息,把消息存入队列 编程步骤: 具体函数的用法可以用man手册查看(强力推荐) (1)ftok()生产key (2)使用msgget( ) 创建/获取消息队列,返回值是队列标识符...(3)使用msgsnd( ) 发送消息     使用msgrcv( ) 接收消息 (4)使用msgctl( ) 删除消息队列 4,实例: sendmsg.c   用来发送消息的 // sendmsg.c...0); printf("类型:%d, 内容:%s\n", msg.mtype, msg.buf); printf("消息接收完成,按回车销毁消息队列\n");

    2.9K90

    Linux 的进程间通信:消息队列

    前言 Linux系统给我们提供了一种可以发送格式化数据流的通信手段,这就是消息队列。...而内核给我们提供的消息队列,无疑大大方便了我们的工作。 Linux环境提供了XSI和POSIX两套消息队列,本文将帮助您掌握以下内容: 如何使用XSI消息队列。 如何使用POSIX消息队列。...这套消息队列在Linux 2.6.6版本之后开始支持,还需要你的glibc版本必须高于2.3.4。...在Linux上,这个值为32768。默认情况下,消息队列会先按照优先级进行排序,就是msg_prio这个值越大的越先出队列。同一个优先级的消息按照fifo原则处理。.../proc/sys/fs/mqueue/queues_max:系统可以创建的消息队列个数上限。 最后 希望这些内容对大家进一步深入了解Linux的消息队列有帮助。

    13.6K01

    Linux进程间通信——消息队列(一)

    今天就聊一聊Linux系统进程之间的通信。...进程间通信根据是否在同一台主机上进行通信可分为无名管道和有名管道(FIFO),消息队列、信号量和共享内存这些都是只能在同一台主机上进行通信的 Socket和Streams(这个没接触过)是可以在不同主机上进行进程通讯的...标识符和Key 每个内核中的IPC结构(消息队列、信号量、共享内存)都用一个非负整数的标识符来进行调用。如,当使用消息队列发送或接收消息队列时,需要知道队列标识符。...例如:如果进程创建 了一个消息队列,并在队列中放入了几条消息,然后进程终止,但是该消息队列及其内容并不会被删除。...当以下情况出现时消息队列才不会继续存在系统中: ①某个进程调用msgrcv或msgctl读取或删除消息队列 ②某个进程执行ipcrm(1)命令删除息队列 与管道相比,最后一个访问管道的进程结束时,管道就彻底被删除了

    3K20
    领券