Pur*_*cle 65 sockets linux posix ipc message-queue
我最近在Linux中一直在使用消息队列(系统V,但POSIX也应该没问题),它们看起来非常适合我的应用程序,但在阅读了Unix编程的艺术之后,我不确定它们是否真的是一个不错的选择.
http://www.faqs.org/docs/artu/ch07s02.html#id2922148
System V IPC的上层消息传递层已基本停止使用.较低层由共享内存和信号量组成,在需要进行互斥锁定和在同一台机器上运行的进程之间进行一些全局数据共享的情况下,仍然具有重要的应用程序.这些System V共享内存工具演变为POSIX共享内存API,支持Linux,BSD,MacOS X和Windows,但不支持经典MacOS.
http://www.faqs.org/docs/artu/ch07s03.html#id2923376
System V IPC工具存在于Linux和其他现代Unix中.但是,由于它们是遗留功能,因此不会经常使用它们.到2003年中期,Linux版本仍然存在漏洞.似乎没有人足够关心它们.
在最近的Linux版本中,System V消息队列是否仍然存在错误?我不确定作者是否意味着POSIX消息队列应该没问题?
似乎套接字几乎是任何东西(?)的首选IPC,但我看不出用套接字或其他东西实现消息队列是多么简单.或者我的想法太复杂了?
我不知道我是否正在使用嵌入式Linux?
Duc*_*uck 75
就个人而言,我非常喜欢消息队列,并认为它们可以说是unix世界中利用率最低的IPC.它们快速且易于使用.
几点想法:
其中一些只是时尚.旧事物再次成为新事物.在消息队列上添加一个闪亮的do-dad,它们可能是明年最新和最热门的东西.使用单独的进程而不是其选项卡的线程来查看Google的Chrome.突然之间,人们很高兴当一个标签锁定时它不会导致整个浏览器崩溃.
共享记忆有一个关于它的He-man光环.如果你没有将最后一个循环挤出机器并且MQ的效率稍微低一些,那么你就不是一个"真正的"程序员.对于许多人而言,如果不是大多数应用程序,这完全是胡说八道,但有时一旦掌握,很难打破心态.
MQ实际上不适合具有无限数据的应用程序.管道或插座等面向流的机制更容易使用.
System V变种确实已经失宠了.作为一般规则,尽可能使用POSIX版本的IPC.
Mar*_*rkR 14
是的,我认为消息队列适用于某些应用程序.POSIX消息队列提供了更好的界面,特别是,您可以为队列命名而不是ID,这对于故障诊断非常有用(可以更容易地查看哪个是哪个).
Linux允许你将posix消息队列作为文件系统挂载并用"ls"查看它们,用"rm"删除它们也非常方便(系统V依赖于笨重的"ipcs"和"ipcrm"命令)
POSIX 消息队列的最大缺点:
select()。(它适用select()于 Linux 但不适用于 Qnx 系统)Unix 数据报套接字执行与 POSIX 消息队列相同的任务。Unix 数据报套接字工作在套接字层。可以将它与select()/poll()或其他 IO-wait 方法一起使用。在设计基于事件的系统时,使用select()/poll()具有优势。可以通过这种方式避免繁忙循环。
消息队列中有惊喜。想想mq_notify()。它用于获取接收事件。听起来我们可以通知有关消息队列的某些信息。但它实际上是注册通知而不是通知任何东西。
更令人惊讶的mq_notify()是,它必须在 every 之后调用mq_receive(),这可能会导致竞争条件(在和mq_send()之间调用其他进程/线程时)。mq_receive()mq_notify()
并且它有一整套mq_open, mq_send(), mq_receive() and mq_close()自己定义的冗余并且在某些情况下与套接字open(),send(),recv() and close()方法规范不一致。
我不认为消息队列应该用于同步。eventfd并且signalfd适合那个。
但它(POSIX 消息队列)有一些实时支持。它具有优先功能。
Messages are placed on the queue in decreasing order of priority, with newer messages of the same priority being placed after older messages with the same priority.
但是这个优先级也可用于套接字作为带外数据!
最后,对我来说,POSIX 消息队列是一个遗留 API。只要不需要实时功能,我总是更喜欢 Unix 数据报套接字而不是 POSIX 消息队列。