管道:Unix系统使用管道,建立进程间通信。管道提供单向数据流。使用 pipe()
函数创建管道。
语法:
#include int pipe(int fd);
pipe ()
函数返回两个文件描述符,fd[O]
和 fd[1]
。fd[0]
为读取而打开,fd[1]
为写入管道而打开。数据从管道的一端流向另一端。管道函数在成功时返回“0”或在错误时返回 -1。
消息队列 :消息队列,允许一个或多个进程写入消息以供其他进程读取。消息队列被实现为消息的链表,并存储在内核中。每个消息队列都由一个消息队列标识符标识。内核跟踪系统中创建的所有消息队列。
管道和消息队列的区别:
编号 | 管道消息队列 | |
---|---|---|
1 | 管道是 Unix IPC 的一种形式,提供单向数据流。 | 消息队列是系统 VIPC 的一种形式,它存储消息的链表 |
2 | 使用 pipe() 函数创建管道,返回两个文件描述符,一个用于读取,另一个用于写入。 |
使用 msgget() 函数创建消息队列会返回一个消息队列标识符。 |
3 | 管道和 FIFO 是单向的,即数据只能沿一个方向流动。 | 消息队列是双向的,即数据可以双向流动。 |
4 | 使用管道和 FIFO,必须按先进先出的顺序获取数据。 | 使用消息队列,可以按照与消息类型关联的值一致的任何顺序读取消息。 |
5 | 不能给消息分配优先级。 | 通过将优先级与类型或类型范围相关联,可以将优先级分配给消息。 |
6 | 对于管道和 FIFO,必须有一些进程等待消息通过管道和 FIFO 写入,即必须同时存在读取进程和写入进程。 | 使用消息队列,进程可以将消息写入队列然后退出,以便稍后其他进程可以读取消息。 |
7 | 当最后一个引用它的进程终止时,管道从系统中完全删除。 | 消息队列及其内容在进程终止时保留在系统中,直到它们被调用 mcgregor magento 的某个进程专门读取或删除,通过执行 ipcrm(1) 命令或通过重新启动系统。 |
8 | FIFO的一个管道可以写入的最大字节数为4096字节。 | 可写入消息队列的最大消息大小为 8192 字节。 |
9 | 使用命名管道的一个主要优点是,它们提供了一种有用的方式,可以将单行请求发送到运行消息处理程序的 OpenEdge 后台会话,从而提高性能。 | 消息队列支持异步通信,这意味着产生和使用消息的端点与队列交互,而不是彼此交互。 |
10 | 多个用户可以通过同一个命名管道发送请求,并且每个请求在收到时从管道中删除。 | 提高可靠性。 |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/266924.html