Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63934
Модуль Forms 63646
ТЕХНОЛОГИИ ДОСТ... 60507
Пример работы с... 59951
Имитационное мо... 55999
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

Пользователей: 13,079
новичок: Openair
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы крупного аэропорта на GPSS + Пояснительная записка
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...
Меры близости на векторах в Delphi + Блок схемы

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Операция опроса
Системный вызов 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 19:35:04 · 0 Комментариев · 1358 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
AVIwriter
Графика в проекта...
Cтатьи Королевств...
WinPopup
Синтаксический ан...
Программирование ...
RAS
С. Г. Горнаков - ...
Платформа програм...
PHP 5 для "чайников"
THttpScan v4.1
Scrrlcaptoin
Разработка клиент...
Х. М. Дейтел, П. ...
Pirc
Blobs [Исходник н...
HtmlLerz PRO
SMLPack v1.0
Паскаль и Дельфи....
XPATComponents

Топ загрузок
Приложение Клие... 100450
Delphi 7 Enterp... 85852
Converter AMR<-... 20067
GPSS World Stud... 12518
Borland C++Buil... 11579
Borland Delphi ... 8508
Turbo Pascal fo... 7023
Visual Studio 2... 4989
Калькулятор [Ис... 4739
FreeSMS v1.3.1 3536
Случайные статьи
Выбор режима экспо...
БЛОКИ
Что такое Introslo...
Настройки почтовог...
Расширение
Безопасность локал...
Оператор безусловн...
Датчики магнитного...
Ввод-вывод объекто...
Подобный класс-ада...
Кнопка с рисунком
юридического отдел...
Прямой метод решен...
Поиск файлов и пап...
ОШИБКИ ОКРУГЛЕНИЯ
Беспроводные средс...
Set base type of r...
неотрицательность ...
Класс TCanvas
Ресурсы
Решение важнейших ...
Перегрузка операци...
Определение вторич...
Запись видео на ф...
Раздел операторов
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?