Joe*_*e.Z 13 c linux message-queue sysv-ipc
我正在研究用于嵌入式Linux上进程间通信的消息队列.我想知道为什么我没有使用Linux提供的消息队列如下:
msgctl,msgget msgrcv,msgsnd.
而不是创建共享内存,并与信号量同步?
直接在业务嵌入式产品上使用这组功能有什么缺点?
Jon*_*ler 10
这些是'System V IPC'消息队列功能.他们会为你工作,但他们相当重.它们由POSIX标准化.POSIX还提供了一个更现代的功能集,msgctl(),msgget(),msgrcv(),msgsnd(),mq_close(),mq_getattr(),mq_notify(),mq_open()这可能是对你更好(比如财富的尴尬).但是,您需要检查默认情况下在目标平台上安装了哪个(如果有).特别是在嵌入式系统中,可能是您必须配置它们,或者甚至安装它们,因为它们默认不存在(共享内存和信号量也是如此).
任何一组消息工具的主要优点是它们是预先调试的(可能),因此已经解决了并发问题 - 而如果你要用共享内存和信号量为自己做这件事,你会得到很多要做到达到相同功能水平的工作.
所以,(重新)尽可能使用.如果是一个选项,请使用两个消息队列系统之一,而不是重新发明自己的系统.如果您最终发现存在性能瓶颈或类似问题,那么您可以调查编写自己的替代方案,但在此之前 - 重用!
System V消息队列(由msg*系统调用操纵的队列)有很多奇怪的怪癖和陷阱.对于新代码,我强烈建议使用UNIX域套接字.
话虽这么说,我也强烈建议通过共享内存方案传递IPC消息.共享内存更容易出错,并且更容易出错.