%20%D0%B2%20%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0.png)
Является ли хорошей практикой создание каталога в /run/shm
(ранее /dev/shm
) и использование его в качестве временного каталога для приложения?
Предыстория: Я пишу тесты черного ящика для программы, которая делает много всего с файлами и каталогами. Для каждого теста я создаю много файлов и каталогов, затем запускаю программу, затем создаю ожидаемый набор файлов и каталогов, а затем запускаю diff для сравнения. Сейчас у меня около 40 тестов, и они уже занимают более 2 секунд. В надежде ускорить процесс я хочу запустить тесты в каталоге на каком-то RAM-диске.
Исследуя информацию о RAM-диске, я наткнулся навопросс ответом, что можно создать каталог /dev/shm
и использовать его как временный каталог. Исследуя еще немного, я наткнулся навики-страницаиз Debian, где говорится, что использовать /dev/shm
напрямую — ошибка. Мне следует использовать shm_*
функции. К сожалению, shm_*
функции, похоже, недоступны для использования в скрипте оболочки.
Теперь я в замешательстве. Можно или нет использовать /run/shm
(ранее /dev/shm
) как временный каталог?
решение1
Совершенно нормально использовать какой-либо каталог в, /run
если у вас есть соответствующие права на него. В некоторых современных дистрибутивах /tmp
уже есть виртуальная файловая система в памяти или символическая ссылка на каталог внутри /run
. Если это ваш случай (вы можете проверить это в /etc/fstab
, или набрав mtab
), вы можете использовать /tmp
в качестве временного каталога.
Также не путайте со статьей из Debian. shm_*
функции используются для создания сегментов общей памяти для межпроцессного взаимодействия. С помощью этих функций вы можете совместно использовать фрагмент памяти между двумя или более процессами, чтобы они могли взаимодействовать или совместно использовать одни и те же данные. Процессы имеют сегмент памяти, прикрепленный в их собственном адресном пространстве, и могут читать и писать там как обычно. Ядро занимается сложностью. Эти функции недоступны как функции оболочки (и не будут очень полезны в контексте оболочки). Для получения дополнительной информации см. man 7 shm_overview
. Суть статьи в том, что ни одна программа не должна напрямую управлять псевдофайлами, представляющими общие сегменты, а вместо этого использовать соответствующие функции для создания, присоединения и удаления сегментов общей памяти.