2013-01-13 21 views
6

Czy kino (na OS X) jest przydatne do odczytu/zapisu zwykłych plików? Wiem, że epoll jest nie przydatne dla zwykłych plików na Linux, więc zastanawiam się, czy to samo dotyczy Kqueue.Klikanie na zwykłych plikach

EDYCJA: Nie mam na myśli odczytu/zapisu plików, oczywiście read() i write() są do tego. Chodzi mi o to, "czy kino rzeczywiście jest przydatne do wykrywania, kiedy plik jest czytelny/zapisywalny?"

Odpowiedz

1

Tak, kqueue może być używany do oglądania plików dla czytelności. Od strony man:

EVFILT_READ  Takes a file descriptor as the identifier, and returns 
        whenever there is data available to read. The behavior 
        of the filter is slightly different depending on the 
        descriptor type. 

[...] 

        Vnodes 
         Returns when the file pointer is not at the end of 
         file. data contains the offset from current posi- 
         tion to end of file, and may be negative. 

(. "Vnodes", w tym kontekście, są zwykłymi plikami)

jak zwykłe pliki są zawsze zapisu, to nie ma sensu, aby zastosować EVFILT_WRITE do nich.

+0

Skąd wiadomo, że zwykłe pliki są zawsze zapisywalne? –

+0

Pliki nie stają się tymczasowo nieprzypisane (z bycia "pełnym") w taki sam sposób, w jaki gniazda, przewody i inne mogą. – duskwuff

+0

@duskwuff nie, ale zdecydowanie blokują. Mogą powodować opóźnienia/rozłączenia aplikacji. Cały sens korzystania z tych mechanizmów sygnalizuje zdarzenie na tych zasobach i kiedy dostęp do tych zasobów nie będzie blokował się w odniesieniu do tych zdarzeń. "pełna" koncepcja jest nieistotna. – Rahly

1

jądra Kolejki są mechanizmy, które "allow you to intercept kernel-level events to receive notifications about changes to sockets, processes, the file system and other aspects of the system."

ja używałem ich w przeszłości detect when when actions happen on a file (lub w gorącym folderze). Nie wierzę jednak, że można je wykorzystać do "czytania" i "pisania" plików. Możesz również użyć funkcji natywnych MacOS lub zwykłych znaków UN * X "fopen", "fwrite" i "fread" również, jeśli chcesz.