I am working on a message queue used to communication among process on embedded Linux. I am wondering why I’m not using the message queues provided by Linux as following:
msgctl, msgget msgrcv, msgsnd.
instead of creating shared memory, and sync up with semaphore?
What’s the disadvantage of using this set of functions directly on a business embedded product?
Advertisement
Answer
The functions msgctl()
, msgget()
, msgrcv()
, and msgsnd()
are the ‘System V IPC’ message queue functions. They’ll work for you, but they’re fairly heavy-weight. They are standardized by POSIX.
POSIX also provides a more modern set of functions, mq_close()
, mq_getattr()
, mq_notify()
, mq_open()
, mq_receive()
, mq_send()
, mq_setattr()
, and mq_unlink()
which might be better for you (such an embarrassment of riches).
However, you will need to check which, if either, is installed on your target platforms by default. Especially in an embedded system, it could be that you have to configure them, or even get them installed because they aren’t there by default (and the same might be true of shared memory and semaphores).
The primary advantage of either set of message facilities is that they are pre-debugged (probably) and therefore have concurrency issues already resolved – whereas if you’re going to do it for yourself with shared memory and semaphores, you’ve got a lot of work to do to get to the same level of functionality.
So, (re)use when you can. If it is an option, use one of the two message queue systems rather than reinvent your own. If you eventually find that there is a performance bottleneck or something similar, then you can investigate writing your own alternatives, but until then — reuse!