Я изучаю Unix IPC, и в моей книге рассказывается только о семействе функций msg*. Однако, просматривая справочные страницы, я узнал об эквивалентах mq_. http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/0650/bks/SGI_Developer/books/T_IRIX_Prog/sgi_html/ch06.html описывает некоторые различия между ними, но я Я не уверен, насколько это зависит от реализации. Есть ли веские причины использовать одно семейство вместо другого? Один из них "лучше" другого?
Должен ли я использовать msgsnd или mq_send?
Ответы:
Функции mq_*
— это функции POSIX. Функции msg*
происходят из того, что обычно известно как «System V IPC» (поскольку они являются частью средства IPC, представленного в UNIX System V, которое также включает общую память и семафоры). Я считаю справедливым сказать, что функции msg*
включены в POSIX. и стандарт X / Open больше из-за обратной совместимости, чем из-за того, что он желателен в других отношениях; это может быть несправедливо по отношению к ним, но обычно стандарты стараются избегать нескольких способов достижения одного и того же результата. Ни того, ни другого в исходных версиях POSIX не было.
Вам нужно подумать, куда вы будете портировать свой код. Я бы предложил использовать более современные функции mq_*
, если они доступны везде, где вам нужно, хотя сам я ими не пользовался. Вообще говоря, функции msg*
использовались реже, чем функции разделяемой памяти и семафора, но этот интерфейс существует примерно (десять лет или больше) дольше, чем интерфейс POSIX, поэтому он может быть более широко доступен.
Как правило, вы должны пытаться использовать версии POSIX, когда это возможно, поскольку они должны быть более переносимыми на более широкий спектр платформ.
Основные отличия заключаются в том, что очереди POSIX могут генерировать сигнал или порождать новый поток, когда сообщения помещаются в пустую очередь. Очереди POSIX также всегда возвращают самое старое сообщение с наивысшим приоритетом; очереди SysV могут возвращать сообщение любого указанного вами приоритета.
Пробег у всех разный, но я считаю интерфейс POSIX более интуитивным и менее причудливым, чем SYSV или SysV IPC в целом.