2013-01-13 16 views
6

È kqueue (su OS X) utile per leggere/scrivere file regolari? So che epoll è non utile per i normali file su Linux, quindi mi chiedo se lo stesso vale per kqueue.Kqueue su file regolari

EDIT: Non intendo leggere/scrivere file, ovviamente read() e write() lo sono. Intendevo dire, "kqueue è davvero utile per rilevare quando un file è leggibile/scrivibile?"

risposta

1

Sì, kqueue può essere utilizzato per visualizzare i file per la leggibilità. Dalla pagina 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. 

(. "Vnodi", in questo contesto, sono file regolari)

come file regolari sono sempre scrivibile, non ha senso applicare EVFILT_WRITE a loro.

+0

Come sai che i file normali sono sempre scrivibili? –

+0

I file non diventano temporaneamente non riscrivibili (da "pieno") nello stesso modo in cui socket, pipe e quant'altro possono. – duskwuff

+0

@duskwuff no, ma sicuramente bloccano. Possono causare rallentamento/blocco dell'applicazione. L'intero punto di utilizzo di questi meccanismi è segnalare un evento su queste risorse e quando l'accesso a queste risorse non verrà bloccato in relazione a questi eventi. il concetto di "pieno" è irrilevante. – Rahly

1

kernel code sono meccanismi che "allow you to intercept kernel-level events to receive notifications about changes to sockets, processes, the file system and other aspects of the system."

Io li ho usato in passato per detect when when actions happen on a file (oa una hot folder). Non credo che possano essere usati per "leggere" e "scrivere" i file, però. Puoi utilizzare le funzioni native di MacOS o lo stile regolare UN * X "fwrite" e "fread" per questo, se lo desideri.