7

В LDD3, я видел такие кодыЗачем нам нужно вызвать poll_wait в опросе?

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; 
} 

Но он говорит poll_wait не будет ждать и сразу же возвращается. Тогда зачем нам это называть? Почему мы не можем вернуть маску?

ответ

10

poll_wait добавляет ваше устройство (представленное «структурным файлом») в список тех, которые могут разбудить процесс.

Идея состоит в том, что процесс может использовать опрос (или выбрать или epoll и т. Д.), Чтобы добавить кучу дескрипторов файлов в список, на который он хочет ждать. Запрашивается запись для каждого драйвера. Каждый добавляет себя (через poll_wait) в список официантов.

Затем ядро ​​ядра блокирует процесс в одном месте. Таким образом, любое из устройств может разбудить процесс. Если вы возвращаете ненулевые биты маски, это означает, что эти «готовые» атрибуты (readable/writable/etc) применяются сейчас.

Таким образом, в псевдо-коде, это примерно так:

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

Затем, когда делает сон процесса? – demonguy

+0

@demonguy См. Мой обновленный ответ –

+0

Вы имеете в виду, что вызов опроса из пользовательского пространства блокирует процесс, не так ли? – demonguy

-1

poll_wait срабатывает, когда есть ожидаемое событие произошло на любом из ФД-х он ждет на OR она попадает тайм-аут.

Проверьте маску, чтобы узнать, какое событие вызвало poll_wait. Если вы не хотите, чтобы poll_wait запускался на таком событии, вы можете настроить его при регистрации дескриптора файла для опроса fd.

+1

Это совершенно неправильно. 'poll_wait' вообще не запускается. Он просто добавляет очередь ожидания в 'poll_table'. – EML

2

В pollfile_operation спит, если вы возвращаетесь 0

Это то, что смутило меня.

Когда вы возвращаете ненулевое значение, это означает, что какое-то событие было уволено, и оно просыпается.

Как только вы видите это, ясно, что что-то должно связывать процесс с очередью ожидания, и эта вещь poll_wait.

Также помните, что struct file представляет собой «соединение между процессом и открытым файлом», а не только файл файловой системы и, как таковой, содержит pid, который используется для идентификации процесса.

Игра с минимальным работоспособным примером может также помочь очистить вещи: https://stackoverflow.com/a/44645336/895245