recvmsg на Redox научился помечать переданные дескрипторы как закрывающиеся

08.02.2026

В recvmsg появился флаг MSG_CMSG_CLOEXEC: файловые дескрипторы, переданные между процессами через сокет, сразу помечаются как закрывающиеся при запуске новой программы. Раньше это приходилось делать отдельно, с гонкой между приёмом и установкой флага.

Как передаётся дескриптор между процессами

Через сокет можно передать не только данные, но и дескриптор файла. Процесс-отправитель отмечает дескриптор специальным флагом, а получатель извлекает из полученных служебных данных новый дескриптор, указывающий на тот же файл. Это базовый механизм передачи прав: дескрипторы передаются между процессами, а не только внутри одного.

На этом строятся межпроцессные каналы, нестандартные протоколы обмена и часть систем, где дочернему процессу передают уже открытый файл.

Какую гонку снимает флаг

Полученный дескриптор не должен достаться детям получателя. Поэтому его помечают как закрывающийся при запуске новой программы.

Обычный порядок действий: получить дескриптор, потом отдельно вызвать установку флага. Между этими двумя шагами другой поток может успеть запустить процесс — и дескриптор утечёт к ребёнку, вместе с доступом к тому, что через него открыто.

Флаг MSG_CMSG_CLOEXEC переносит установку внутрь самого вызова: дескриптор приходит уже помеченным. Окна нет.

Почему это касается Rust

В стандартной библиотеке Rust такого флага нет — дескрипторы помечаются вручную через libc или rustix. То есть код на Rust, который передаёт дескрипторы между процессами, вынужден повторять двухшаговую последовательность и живёт с её гонкой.

Крейты, реализующие IPC, в том числе на UnixStream и socket2, выигрывают от атомарности: меньше кода и нет узкого места, о котором легко забыть.

Оригинал

Коммит feat: Implement MSG_CMSG_CLOEXEC handling to recvmsg от 8 февраля 2026 года в репозитории redox-os/relibc. Сводка «This Month in Redox — February 2026», раздел «Relibc Improvements»

Упоминаний: 1 · Просмотров: 2