2016-09-09 2 views
13

На протяжении вызовов CoreFoundation framework source, POSIX файловой системы API (например open(), stat(), и др ...) являются wrapped in an idiom, в котором дескриптор на /dev/autofs_nowait приобретается - с - до Выполняются вызовы POSIX; после этого дескриптор close() 'd перед выходом области.риски и выгоды, связанные с использованием/DEV/autofs_nowait на OS X

  • В чем преимущество этого? Каковы риски?

  • ли заручаются /dev/autofs_nowait дескриптора оказывают никакого влияния на, или это осуществляется, флаги на любые константы выглядит завернутых open() вызовов (например, например, O_NONBLOCK)?

  • /dev на моей машине, работает OS X 10.10.5 имеет другую «Autofs» запись:

    dev directory listing

    ... ни одна из которых имеет man страницы доступной. Если эти файловые устройства могут предложить преимущества в этом ключе, мне было бы интересно услышать об их использовании, как это может иметь место.



Добавление: Я не мог найти много на эту тему; а Google Plus post from 2011 утверждает, что:

[т] его файл является специальным устройством, который контролируется реализацией файловой системы AutoFS в ядре. При открытии файловая система autofs не будет блокировать этот процесс при любых операциях ввода-вывода в файловой системе autofs .

Я не совсем уверен, что это значит (они были конкретно говорить о том, как launchd работ, FWIW), но мне было интересно об этом сам, так что я написал a quick context-manager-y RAII struct к try it out - нецелевой профилирование показывает тесты с POSIX вызовов завершения быстрее но в общих чертах; Я буду исследовать эту тактику с более тонкой зубчатой ​​гребенкой, после того как я получу больше информации о том, как все это работает.

+1

Если это работает на основе каждого процесса, это может вызвать нежелательное поведение в других потоках, которые * не хотят ингибирования. – o11c

+0

@ o11c Полезно знать, спасибо. – fish2000

ответ

4

Эти устройства позволили разработчику (-ам) избежать определения нового syscall или ioctl для функциональности, и, возможно, он был реализован именно так, потому что он был проще, требует обновления кода и не меняет VFS API, которые, возможно, были опасениями в то время.

Когда вы открываете /dev/autofs_nowait и проходите путь, вы запускаете автоподстройки, но не ждите их завершения (в противном случае ваш процесс блокируется до тех пор, пока файловая система не будет смонтирована или после истечения времени работы), чтобы вы могли получить a ENOENT при открытии файла, даже если все идет хорошо.

OTOH, /dev/autofs_notrigger заставляет процесс даже не запускать автоматический монтаж.

Это все эти устройства.Дело в том, что при реализации Дарвина open может блокироваться при перемещении файловой системы даже с O_NONBLOCK или O_NDELAY.

Вы можете следить за потоком из VFS, из open эксплуатации vnode:

В этом пути нет обработки (не) блокировки.

+0

ОК, поэтому, если я правильно понимаю, разработчик (-ы) создал как '/ dev/autofs_nowait', так и'/dev/autofs_notrigger', чтобы по существу не добавлять новый флаг, например. 'fcntl()' задание 'autofs' поведения? ... Вы бы назвали это правильно опущенным кратким резюме? – fish2000

+1

Не точно, 'fcntl' работает на определенном (уже открытом) fd, тогда как' autofs_nowait' влияет на каждую операцию. Почему это было реализовано именно так? возможно, потому что это было проще, требует обновления кода и не изменяет API VFS, что, возможно, было проблемой в то время. –

+0

Возможно, мне следует отредактировать ответ, чтобы добавить это ... –