2015-05-14 11 views
7

In LDD3, ho visto tali codiciPerché dobbiamo chiamare poll_wait nel sondaggio?

static unsigned int scull_p_poll(struct file *filp, poll_table *wait) 
{ 
    struct scull_pipe *dev = filp->private_data; 
    unsigned int mask = 0; 

    /* 
    * The buffer is circular; it is considered full 
    * if "wp" is right behind "rp" and empty if the 
    * two are equal. 
    */ 
    down(&dev->sem); 
    poll_wait(filp, &dev->inq, wait); 
    poll_wait(filp, &dev->outq, wait); 
    if (dev->rp != dev->wp) 
     mask |= POLLIN | POLLRDNORM; /* readable */ 
    if (spacefree(dev)) 
     mask |= POLLOUT | POLLWRNORM; /* writable */ 
    up(&dev->sem); 
    return mask; 
} 

Ma dice poll_wait non aspettiamo e tornerà immediatamente. Allora perché dobbiamo chiamarlo? Perché non possiamo semplicemente restituire la maschera?

risposta

10

poll_wait aggiunge il dispositivo (rappresentato dal "file struct") all'elenco di quelli che possono riattivare il processo.

L'idea è che il processo possa utilizzare il polling (o selezionare o epoll ecc.) Per aggiungere un gruppo di descrittori di file all'elenco su cui desidera attendere. La voce del sondaggio per ogni driver viene chiamata. Ognuno si aggiunge (tramite poll_wait) alla lista dei camerieri.

Quindi il kernel centrale blocca il processo in un unico punto. In questo modo, uno qualsiasi dei dispositivi può riattivare il processo. Se si restituiscono bit maschera diversi da zero, ciò significa che gli attributi "pronti" (leggibili/scrivibili/ecc.) Si applicano ora.

Così, in pseudo-codice, è più o meno in questo modo:

foreach fd: 
    find device corresponding to fd 
    call device poll function to setup wait queues (with poll_wait) and to collect its "ready-now" mask 

while time remaining in timeout and no devices are ready: 
    sleep 

return from system call (either due to timeout or to ready devices) 
+0

Poi, quando fa il sonno processo? – demonguy

+0

@demonguy Vedi la mia risposta aggiornata –

+0

Vuoi dire che la chiamata di polling dallo spazio utente bloccherà il processo, giusto? – demonguy

-1

poll_wait si attiva quando c'è un evento atteso verificato su uno qualsiasi dei FD di esso è in attesa o colpisce timeout.

Controllare la maschera per sapere quale evento ha attivato poll_wait. Se non si desidera che poll_wait si attivi su tale evento, è possibile configurarlo durante la registrazione del descrittore di file nel polling fd.

+1

Questo è completamente sbagliato. 'poll_wait' non si attiva affatto. Semplicemente aggiunge una coda di attesa al 'poll_table'. – EML

2

I pollfile_operation posti letto se si torna 0

Questo è ciò che mi era confusa.

Quando si restituisce un valore diverso da zero, significa che alcuni eventi sono stati attivati ​​e si riattivano.

Una volta visto questo, è chiaro che qualcosa deve legare il processo alla coda di attesa, e quella cosa è poll_wait.

Ricorda inoltre che struct file rappresenta "una connessione tra un processo e un file aperto", non solo un file di file system e come tale contiene il pid, che viene utilizzato per identificare il processo.

Giocare con un esempio eseguibile minimo potrebbe anche aiutare a chiarire le cose: https://stackoverflow.com/a/44645336/895245

Problemi correlati