2016-09-09 35 views
13

Przez połączeń CoreFoundation framework source POSIX plików API (np open(), stat(), wsp ...) są wrapped in an idiom którym deskryptor na /dev/autofs_nowait jest nabytą - z - przed Wykonuje się połączenia POSIX; następnie deskryptor ma wartość close() 'przed wyłączeniem zakresu.Ryzyka i korzyści wynikające z używania/dev/autofs_nowait na OS X

  • Jakie są tego korzyści? Jakie są zagrożenia?

  • Czy pozyskiwania deskryptor /dev/autofs_nowait mają żadnego wpływu na lub jest dokonywane przez, flagi jakichkolwiek wygląda następująco owinięte open() połączeń (jak np O_NONBLOCK)?

  • /dev na moim komputerze z systemem OS X 10.10.5 ma inne „autofs” wpisy:

    dev directory listing

    ... z których żaden nie ma man stron dostępne. Jeśli te urządzenia podobne do plików mogą oferować korzyści w tym duchu, chciałbym usłyszeć o ich wykorzystaniu, jak może się to odnosić.



Uzupełnienie: Nie mogłem znaleźć wiele na ten temat; A Google Plus post from 2011 twierdzi, że:

[t] jego plik jest specjalnym urządzeniem, który jest monitorowany przez wdrożenie autofs systemu plików w jądrze. Po otwarciu system plików autofs nie będzie blokował tego procesu w żadnych operacjach we/wy w systemie plików autofs w wersji .

Nie jestem pewien, co to znaczy (zostały one specjalnie mówić o tym, jak launchd prac, FWIW), ale byłem ciekaw o tym sam, więc napisałem a quick context-manager-y RAII struct do try it out - niekierowane profilowanie pokazuje testy z POSIX wywołań ukończenie szybciej ale w ogólnych hashmarks; Zbadam tę taktykę za pomocą grzebienia o drobniejszym uzębieniu, gdy dowiem się więcej o tym, jak to wszystko działa.

+1

Jeśli działa to w trybie per-process, może to powodować niepożądane zachowanie w innych wątkach, które * nie * chcą zahamować. – o11c

+0

@ o11c Dobrze wiedzieć, dzięki. – fish2000

Odpowiedz

4

Te urządzenia pozwoliły na uniknięcie implementatora (ów) do zdefiniowania nowej funkcji dla funkcji syscall lub ioctl, ponieważ było to prostsze, wymagało aktualizacji mniejszej ilości kodu i nie zmienia interfejsu API VFS, które mogły być obawy w tym czasie.

Po otwarciu /dev/autofs_nowait i przechodzeniu przez ścieżkę, uruchamia się automatyczne montowanie, ale nie czekaj, aż się skończą (w przeciwnym razie bloki procesowe zostaną zamontowane do czasu zainstalowania systemu plików lub po upłynięciu limitu czasu operacji), więc możesz otrzymać a ENOENT podczas otwierania pliku, nawet jeśli wszystko idzie dobrze.

OTOH, /dev/autofs_notrigger powoduje, że proces nie powoduje nawet automatycznego montażu.

To wszystko, co robią te urządzenia.Rzecz w tym, że w implementacji Darwina open może blokować podczas przechodzenia przez system plików nawet z O_NONBLOCK lub O_NDELAY.

Możesz śledzić przepływ z VFS, od operacji open z vnode:

W dół tej ścieżki nie ma obsługi zachowania (nie) blokującego.

+0

OK, więc jeśli rozumiem poprawnie, executor (y) stworzyli zarówno '/ dev/autofs_nowait' oraz'/dev/autofs_notrigger', aby zasadniczo uniknąć konieczności dodawania nowej flagi do np. 'fcntl()' określające zachowanie 'autofs'? Czy nazwałbyś to poprawnie streszczonym streszczeniem? – fish2000

+1

Niezupełnie, 'fcntl' działa na określonym (już otwartym) fd, a' autofs_nowait' wpływa na każdą operację. Dlaczego został wdrożony w ten sposób? być może dlatego, że było prostsze, wymaga aktualizacji mniejszej ilości kodu i nie zmienia interfejsu API VFS, co mogło być problemem w tym czasie. –

+0

Być może powinienem edytować odpowiedź, aby dodać ... –