На большинстве Linux-систем
/dev/shm смонтирован как tmpfs. Удобное место для временных данных и обмена между процессами: обычные файловые операции, без отдельного сервиса.Но для практического использования интереснее нюансы.
1. tmpfs умеет уходить в swap
При нехватке памяти его страницы могут попасть в swap. С Linux 6.4 существует опция монтирования
noswap. А size=1G задаёт потолок размера, не резервирует гигабайт заранее.Проверить своё окружение:
findmnt -T /dev/shm -o TARGET,FSTYPE,OPTIONS
df -h /dev/shm
df -i /dev/shm
2. Быстрая запись не означает безопасное обновление
Открытие файла через
fopen(path, "w") сначала обнулит его. Параллельный читатель может увидеть пустой файл или часть новых данных.Для публикации снимка состояния: записать временный файл, закрыть его и выполнить
rename() в пределах того же монтирования. Замена имени атомарна. Уже открытые дескрипторы продолжат читать старый файл, новые открытия получат новый. Конкурирующих писателей это само по себе не синхронизирует.3. В Docker место заканчивается быстро
Без переопределения настроек
/dev/shm обычно ограничен 64 MiB. Размер задаётся через --shm-size.4. Для IPC без файлового имени есть `memfd_create()`
Получаете анонимный файл и можете передать его дескриптор другому процессу через Unix-сокет. А *seals* позволяют запретить изменение содержимого или размера после подготовки данных. Полезно для передачи неизменяемых буферов.