Pipe vs msg queue
В чем разница между очередями сообщений и каналом в Linux?
Ответы
Ответ 1
Сверху моей головы и предполагая, что вы говорите о очередях сообщений posix (а не SysV):
- Трубы не ограничены по размеру, очереди сообщений.
- Трубы могут быть интегрированы в системы с файловыми дескрипторами, очереди сообщений имеют свой собственный набор функций, хотя linux поддерживает
select()
, poll()
, epoll()
и друзей в mqd_t
.
- Трубы, когда-то закрытые, требуют некоторого сотрудничества с обеих сторон для их восстановления, очереди сообщений могут быть закрыты и вновь открыты с обеих сторон без объединения другой стороны.
- Трубы плоские, подобно потоку, чтобы навязывать структуру сообщений, которые вам нужно будет реализовать с обеих сторон, очереди сообщений уже ориентированы на сообщения, не нужно берется, чтобы получить, скажем, пятое сообщение в очередь.
Ответ 2
На самом деле это очень разные вещи.
Самое большое практическое различие заключается в том, что в трубе нет понятия "сообщения", это всего лишь труба до write()
байтов и read()
байтов. У получающей стороны должен быть способ узнать, какая часть данных представляет собой "сообщение" в вашей программе, и вы должны реализовать это самостоятельно. Кроме того, определяется порядок байтов: байты выходят в том порядке, в который вы их вставляете. И, вообще говоря, он имеет один вход и один выход.
Очередь сообщений используется для передачи "сообщений", имеющих тип и размер. Таким образом, принимающая сторона может просто ждать одного "сообщения" с определенным типом, и вам не придется беспокоиться, если это будет завершено или нет. Несколько процессов могут отправлять и получать из одной очереди.
см. man mq_overview
и/или man svipc
для получения дополнительной информации.