Мне нужно собрать список всех смонтированных «точек монтирования», к которым имеет доступ локальная файловая система.
Это включает в себя:
- Любой обычно смонтированный том под
/Volumes
. - Любой том NFS, смонтированный в настоящее время под
/net
. - Любая локальная или удаленная файловая система, смонтированная с помощью команды «mount» или автоматически смонтированная каким-либо образом.
Но мне нужно избегать доступа к любым файловым системам, которые могут быть смонтированы автоматически, но в данный момент не смонтированы. Т. е. я не хочу вызывать никаких автоначислений.
Мой текущий метод выглядит следующим образом:
- Вызовите
FSGetVolumeInfo()
в цикле, чтобы собрать все известные тома. Это даст мне все локальные диски под/Volumes
, а также/net, /home
и монтирования NFS под/net
. - Вызовите
FSGetVolumeParms()
, чтобы получить «идентификатор устройства» каждого тома (это оказывается путем монтирования для сетевых томов). - Если идентификатор представляет собой путь POSIX (т. е. он начинается с «/»), я использую
readdir()
в его родительском пути, чтобы проверить, действительно ли родительский каталог содержит элемент точки монтирования (например, если идентификатор равен/net/MyNetShare
, то я читаю каталог/net
). Если он недоступен, я предполагаю, что это точка автоматического монтирования с еще не смонтированным томом, и поэтому исключаю его из моего списка смонтированных томов. - Наконец, если том кажется смонтированным, я проверяю, содержит ли он какие-либо элементы. Если да, то добавлю в свой список.
Шаг 3 необходим, чтобы увидеть, действительно ли путь смонтирован. Если вместо этого я вызову lstat()
для полного пути, он попытается автоматически смонтировать файловую систему, чего мне следует избегать.
Теперь, несмотря на то, что вышеописанное работает большую часть времени, все еще есть некоторые проблемы:
- Сочетание вызовов API-интерфейсов BSD и Carbon, а также специального оформления значения «идентификатор устройства» довольно нечисто.
- Вызов
FSGetVolumeInfo()
дает мне точки монтирования, такие как "/net" и "/home", даже если они не кажутся реальными точками монтирования - точки монтирования скорее появляются внутри них. Например, если бы я смонтировал общий ресурс NFS в «/net/MyNFSVolume», я бы собрал как точку «/net», так и «/net/MyNFSVolume», но точка «/net» не является фактическим томом. . - Хуже всего то, что иногда описанный выше процесс по-прежнему вызывает активные попытки связаться с автономным сервером, что приводит к длительным тайм-аутам.
Итак, кто может показать мне лучший способ найти все фактически смонтированные тома?