消息队列和管道的区别(转载)
转载自:http://bbs.chinaunix.net/viewthread.php?tid=265266
作者:beginner-bj
请问管道和消息队列有什么不同
管道通信(PIPE)
管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个
进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读
端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息
的流水线。
利用系统调用PIPE()创建一个无名管道文件,通常称为无名管道或PIPE;利用系统调用MKNOD()创建
一个有名管道文件,通常称为有名管道或FIFO。
PIPE是一种非永久性的管道通信机构,当它访问的进程全部终止时,它也将随之被撤消;它也不能用于不
同族系的进程之间的通信。而FIFO是一种永久的管道通信机构,它可以弥补PIPE的不足。
管道文件被创建后,便可对它进行读写操作,通过系统调用WRITE()和READ()来实现。通信完毕后,
可将管道文件关闭,用CLOSE()来实现。
消息通信(MESSAGE)
消息通信方式以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息
缓冲区被组织成队列,通常称之为消息队列。
创建消息队列用系统调用MSGGET()来实现,这一步工作也被称为消息队列的初始化。在进行通信时,消
息队列的发送和接收分别用系统调用MSGSND()和MSGRCV()来实现。在需要改变队列的使用权限及其它
一些特性时,用MSGCTL()来实现。
转载自:http://bbs.chinaunix.net/viewthread.php?tid=257062
作者:foxmanzj
请问消息队列比运用管道有什么优势?
管道一般用于父子进程间通信(有名管道除外,有名管道不限于父子进程通信)。而消息队列可用于你机
器上的任何进程间通信(只要进程有权操作消息队列)。
转载自:http://www.linuxsir.org/bbs/showthread.php?t=235978
作者:kj501
如果要大规模的复制数据,最快的方法莫过于共享内存。管道只是所有的UNIX都支持,性能上肯定不如共
享内存。
至于消息队列,有些UNIX系统肯定是不支持的。具体的你可以看看APUE第二版的15.1节
转载自:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人
员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不
能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管
道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。
转载自:http://blog.sina.com.cn/s/blog_4a0e545d01000c7l.html
vxworks消息队列与其他方式的一些比较:
1、信号量使用方便,可以解决很多任务间的协调问题,但是信号量所传递的信息有限,而内存共享虽然
传递信息可以大些,但是不标准。消息队列作为一种折忠方式用于线程之间的信息交换。
2、消息队列允许许多的消息排队,而每个信息可以有不同长度,而传统管道中的数据仅仅是一个数据流
,没有边界。Vxworks中的管道数据有消息组成。
vxworks消息队列
消息队列允许一定数量不同长度的消息进行排列。任何任务或中断服务程序(ISR)能够发送消息给消息队
列。任何任务可以从消息队列接受消息。多任务可以从同意消息队列发送和接受消息。两个任务之间的全
双工(Full-duplex)通信需要针对不同方向的两个消息队列。
一个任务或中断服务程序(ISR)用函数msgQSend( )发送一个消息到消息队列。如果没有任务等待消息队列
的消息,这个消息被添加消息缓存的队列里。如果某些任务已经在等待消息队列中的消息,消息立刻被传
递给第一个等待的消息的任务。
一个任务用函数msgQReceive( )从消息队列得到一个消息。如果消息队列缓存中有消息存在,第一个消息
立刻出列并回到调用处(caller).如果没有消息存在,则任务(calling task)停止(blocks)并被添加到
等待消息的任务队列中。这个等待的任务队列按照优先级或先进先出(FIFO)规则排列,这个规则有消息
队列创建时所指定。
管道(Pipes)
管道对消息队列提供了一个可供选择的接口,VxWorks的I/O系统。管道是虚拟的I/O设备,由驱动pipeDrv
管理。函数pipeDevCreate()创建一个管道设备,这个调用指定管道的名字,能被排列的最多的消息数,
和每个消息允许的长度。
status = pipeDevCreate ("/pipe/name", max_msgs, max_length);
被创建的管道是一个通常命名(named)的I/O设备,任务能用标准的I/O函数打开,读,写管道,并能调用
ioctl例程。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和
消息队列一样,ISR可以向管道写入,但不能从管道读取。
转载自:http://www.witech.com.cn/news/Article_Show.asp?ArticleID=231
vxworks消息队列和管道
消息队列是VxWorks提供的单个CPU中的任务之间通信的主要机制之一。消息队列允许基于FIFO或基于任务
优先级方式排队消息,一个消息队列的消息数目和消息长度可以由开发者在创建消息队列时指定。在理论
上,VxWorks允许多个任务向同一个消息队列发送消息,或者从同一个消息队列接收消息;而在实际应用
中,一般来说只有一个任务从消息队列接收消息,有一个或多个任务发送消息,即这个消息队列有多个生
产者,而只有一个消费者。消息队列时单向的,对于需要进行双向通信的两个任务,必须使用两个消息队
列。消息队列非常适合于Client-Server结构的任务之间的通信.
在VxWorks中,消息队列是一种代价比较高的一种通信机制,因此在使用时应该使消息的长度尽量短,而
且应避免在需要十分频繁通信的场合使用消息队列。另外消息队列中的消息是排队的,即使是完全相同的
消息,后面的消息也不会覆盖前面的消息。
管道(pipe)
在VxWorks中,管道是一种通过虚拟的I/O设备来实现的消息队列通信机制。使用函数pipeDevCreate()和
pipeDevDelete()来生成和删除管道,管道一经生成后,任务之间就可以使用标准I/O操作主要是read()和
write()进行通信。管道的优点在于它是一个I/O设备,与标准的VxWorks
I/O一样,可以使用select机制,而有了select机制,一个任务很方便地使用多个异步I/O设备,如任务要
处理同时从串口、管道、socket接收到的数据,就可以使用select。