Pipe vs msg queue

В чем разница между очередями сообщений и каналом в Linux?

Ответы

Ответ 1

Сверху моей головы и предполагая, что вы говорите о очередях сообщений posix (а не SysV):

  • Трубы не ограничены по размеру, очереди сообщений.
  • Трубы могут быть интегрированы в системы с файловыми дескрипторами, очереди сообщений имеют свой собственный набор функций, хотя linux поддерживает select(), poll(), epoll() и друзей в mqd_t.
  • Трубы, когда-то закрытые, требуют некоторого сотрудничества с обеих сторон для их восстановления, очереди сообщений могут быть закрыты и вновь открыты с обеих сторон без объединения другой стороны.
  • Трубы плоские, подобно потоку, чтобы навязывать структуру сообщений, которые вам нужно будет реализовать с обеих сторон, очереди сообщений уже ориентированы на сообщения, не нужно берется, чтобы получить, скажем, пятое сообщение в очередь.

Ответ 2

На самом деле это очень разные вещи.

Самое большое практическое различие заключается в том, что в трубе нет понятия "сообщения", это всего лишь труба до write() байтов и read() байтов. У получающей стороны должен быть способ узнать, какая часть данных представляет собой "сообщение" в вашей программе, и вы должны реализовать это самостоятельно. Кроме того, определяется порядок байтов: байты выходят в том порядке, в который вы их вставляете. И, вообще говоря, он имеет один вход и один выход.

Очередь сообщений используется для передачи "сообщений", имеющих тип и размер. Таким образом, принимающая сторона может просто ждать одного "сообщения" с определенным типом, и вам не придется беспокоиться, если это будет завершено или нет. Несколько процессов могут отправлять и получать из одной очереди.

см. man mq_overview и/или man svipc для получения дополнительной информации.