Системный вызов poll проверяет все указанные в параметрах дескрипторы. Если происходит любое событие из входящих в список интересных, вызов немедленно завершает выполнение после просмотра всех дескрипторов.
Также вам может показаться, что такая тема как http://memker.ru/catalog/magnitnye-derzhateli никак не связана и даже не тематична. Хотя, может быть и связана. В любом случае все-таки зайдите на сайт memker.ru. Тема купить держатель для телефона в машину там представлена весьма широко. На том сайте можно узнать много интересного на тему купить держатель для телефона в машину. Что означает вообще тема купить держатель для телефона в машину, где найти купить держатель для телефона в машину - про это написано на сайте memker.ru. Это очень важная для многих людей тема - купить держатель для телефона в машину. Спасибо сайту memker.ru за информацию на тему купить держатель для телефона в машину.
В противоположном случае процесс блокируется до тех пор, пока не наступит одно из ожидаемых событий. На выходе из функции поле revents каждой структуры pollfd будет содержать событие, произошедшее для указанного дескриптора (если таковое имело место). Функция poll также завершает выполнение после промежутка времени, равного параметру timeout (время указывается в миллисекундах).
Если параметр timeout равен 0, функция poll прекращает работу незамедлительно. Если timeout равняется INFTIM или -1, функция закончит работу только после возникновения интересующего события (либо при прерывании системного вызова). Возвращаемое значение poll описывает число произошедших событий, 0 — если имел место выход по исчерпанию времени или -1, если выполнение завершилось неудачно по другой причине.
В приведенном выше примере сервер может вызвать функцию poll, указав флаг P0LLIN для каждого дескриптора. Если вызов возвратит число больше О, сервер сделает вывод о наличии хотя бы одного сообщения на каком-то соединении и проверит структуры pollfd. Затем сервер прочтет сообщение из соответствующего дескриптора, обработает его и повторно вызовет poll для нового опроса.
Реализация вызова poll
Несмотря на то, что дескрипторы, передаваемые системному вызову poll, могут ссылаться на любые файлы, как правило, он используется по отношению к файлам символьных или STREAMS-устройств. По этой причине описание работы вызова будет сфокусировано именно на вышеперечисленных типах файлов. Одним из интересных применений poll является блокировка процесса таким образом, чтобы его пробуждение произошло после наступления одного или нескольких определенных событий. Для этого ядро использует две структуры данных, pollhead и polldat. Структура pollhead ассоциируется с файлом устройства и содержит очередь структур polldat. Каждая структура polldat идентифицирует заблокированный процесс, а также события, по которым он был заблокирован. Процесс, блокируемый по нескольким устройствам, обладает набором структур polldat по одной на каждое устройство. Они взаимосвязаны между собой
Системный вызов poll просматривает указанные ему дескрипторы в цикле и запускает операции VOP_POLL ассоциированных с этими дескрипторами объектов vnode. Синтаксис их вызова следующий:
error = V0P_P0LL (vp. events, anyyet, Srevents. &php);
где параметр vp является указателем на vnode, events — битовая маска опрашиваемых событий, a enyyet — количество ожидаемых событий, уже обнаруженных системным вызовом poll по отношению к другим дескрипторам. Операция возвращает в revents набор произошедших событий, а параметр php содержит указатель на структуру pollhead.
В случае символьного устройства операция V0P_P0LL реализована в виде процедуры spec_poll(), которая производит обращение к таблице cdevsw[] и вызывает процедуру драйвера d_xpoll(), осуществляющую проверку, не ожидает ли устройство указанного события. В этом случае происходит обновление маски revents и выход. Если устройство не ожидает каких-либо событий и параметр anyyet равняется нулю, процедура возвращает указатель на структуру pollhead устройства. Драйверы символьных устройств, как правило, выделяют структуру pollhead для каждого обслуживаемого ими младшего номера устройства.
После возврата функции V0P_P0LL системный вызов poll проверяет значения переменных revents и anyyet. Если обе переменные равны нулю, ни одно интересующее событие не ожидается устройством. В этом случае вызов poll получает из параметра php указатель на структуру poolhead, размещает структуру polldat и добавляет ее в очередь pollhead. Он сохраняет в структуре polldat указатель на структуру ргос и маску событий устройства, а также соединяет ее с другими структурами polldat процесса.
Если устройство возвращает ненулевое значение переменной revents , это означает, что событие уже ожидается устройством и вызову poll нет необходимости блокировать процесс. В этом случае функция удаляет все структуры polldat из очередей pollhead и освобождает их. Затем она увеличивает значение anyyet на количество событий, установленных в revents. При опросе следующего устройства драйвер обнаружит, что параметр anyyet отличен от нуля и не станет инициировать структуру pollhead.
Если ни одно из указанных событий не ожидается ни одним устройством, вызов poll блокирует процесс. Информация об ожидаемых событиях при этом поддерживается драйверами. Когда происходит одно из таких событий, драйвер вызывает функцию pollwakeup(), передает ей событие и указатель на структуру pollhead устройства. Вызов просматривает очередь polldat структуры pollhead и будит все процессы, находящиеся в режиме ожидания события. Для каждого процесса также просматривается цепочка polldat с целью удаления и освобождения структур polldat из очереди pollhead.
Операция опроса должна быть реализована в каждой операционной системе или устройстве. Некоторые файловые системы, такие как ufs или s5fs, используют для этой цели процедуру ядра fs_poll(), которая производит копирование флагов из параметра events в revents и после этого завершает свою работу. Это приводит к возврату poll без блокировки процессов. Такой подход, как правило, применяется блочными устройствами. Устройства STRAMS используют для поставленной цели процедуру strpoll(), опрашивающую любой обычный поток.
Опубликовал katy
June 24 2015 16:35:04 ·
0 Комментариев ·
2703 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.