Да, в Linux (и всех других POSIX-совместимых ядрах )индексный дескриптор файла будет существовать до тех пор, пока его не закроют все процессоры. Сюда входят mmaped-файлы.
Это требуется POSIX:
The mmap() function adds an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference is removed when there are no more mappings to the file.
Open/mmap символической ссылки отслеживает только индексный дескриптор целевого файла (, за исключением крайнего случая использованияO_PATH
). Все символические ссылки в пути разрешаются при вызове open()
, а дескриптор файла ссылается только на целевой файл.
Вы можете проверить это:
/tmp/original
/tmp/symlink
, указывающую на/tmp/original
/tmp/symlink
в программе например. введите в оболочке Pythonf = open('/tmp/symlink', 'r')
/proc//fd
/tmp/original
Убедитесь, что при перекомпиляции файл.so действительно удаляется и создается заново, а не записывается напрямую, и что длительный процесс не использует, например,. dlopen
для динамического повторного открытия файла.so.
Другая возможность, о которой я могу думать, заключается в том, что ленивая привязка приводит к отсрочке загрузки файла.so в долго выполняющемся процессе.
Вы можете попробовать запустить длительный процесс с LD_BIND_NOW=1
в среде, а затем посмотреть, не приведет ли перекомпиляция к сбою процесса, чтобы проверить, не вызвана ли проблема отложенным связыванием.
ffmpeg
инструкция содержит множество примеров:https://ffmpeg.org/ffmpeg-filters.htmlsox
:http://sox.sourceforge.net/sox.html