| Предыдущий | Следующий |
| MACH_RCV_TIMED_OUT | MACH_RCV_INTERRUPTED |
MACH_RCV_TOO_LARGE
Параметр меняет поведение при угрозе потери данных
MACH_RCV_TOO_LARGE означает, что следующее входящее сообщение не помещается в буфер receive_limit. При использовании MACH_RCV_LARGE сообщение остаётся в очереди, а Mach возвращает его фактический размер в буфере результата, позволяя получателю выделить подходящий буфер и безопасно принять сообщение. Без этого параметра слишком большое сообщение извлекается из очереди и уничтожается; вызывающая сторона получает только ограниченные сведения заголовка.
Это различие принципиально для надёжного IPC. Буфер фиксированного размера может работать в тестовой среде, но приводить к потере сообщений в эксплуатации, когда протокол развивается, диагностическая нагрузка увеличивается или одноранговый узел отправляет неожиданные данные. Наиболее безопасная политика — задать ограничения протокола и при этом явно обрабатывать сообщаемый ядром размер.
Проектирование надёжного получателя
- Используйте
MACH_RCV_LARGE, если протокол допускает сообщения переменного размера, и выделяйте память с учётом установленного максимума. - Перед выделением памяти проверяйте возвращённый размер относительно максимума приложения.
- Не предполагайте, что слишком большое сообщение было отброшено; определяйте поведение по маске параметров.
- Версионируйте протокол и явно отклоняйте чрезмерные полезные нагрузки, а не полагайтесь на фиксированный буфер приёма.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Исходный код Apple XNU: mach/message.h
- Справочник GNU Mach: межпроцессное взаимодействие
Нужно найти другой код? Найти другой код состояния или ошибки.