Должен ли я использовать msgsnd или mq_send?

Я изучаю Unix IPC, и моя книга только рассказывает о семействе функций msg *. Однако при просмотре страниц man я узнал о эквивалентах mq_. http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/0650/bks/SGI_Developer/books/T_IRIX_Prog/sgi_html/ch06.html описывает некоторые различия между ними, но я не уверен насколько это связано с реализацией. Есть ли веские причины использовать одну семью над другой? Является ли он «лучше», чем другой?

Функции mq_* – это функции POSIX. Функции msg* относятся к тому, что обычно известно как «System V IPC» (поскольку они являются частью объекта IPC, представленного в UNIX System V, который также включает разделяемую память и семафоры). Я считаю справедливым сказать, что функции msg* включены в стандарт POSIX и X / Open больше из-за обратной совместимости, чем для желаемого использования; что может сделать их несправедливостью, но, как правило, стандарты стараются избегать нескольких способов достижения одного и того же результата. В исходных версиях POSIX они не были ни одним из них.

Вам нужно рассмотреть, где вы будете переносить свой код. Я бы предложил использовать более современные функции mq_* если они доступны везде, куда вам нужно идти, хотя я сам их не использовал. Вообще говоря, функции msg* реже использовались, чем функции разделяемой памяти и семафора, но этот интерфейс был примерно на десять или более раз больше, чем POSIX, поэтому он может быть более широко доступен.

Как правило, вы должны попытаться использовать версии POSIX, когда сможете, поскольку они должны быть более переносимыми на более широкий спектр платформ.

Основные различия заключаются в том, что очереди POSIX могут генерировать сигнал или порождать новый stream, когда сообщения помещаются в пустую очередь. Очереди POSIX также всегда возвращают самое старое сообщение с наивысшим приоритетом; очереди SysV могут возвращать сообщение о любом указанном вами приоритете.

Каждый пробег будет меняться, но я считаю интерфейс POSIX более интуитивным и менее причудливым, чем SYSV, или SysV IPC в целом.