Программирование на C

Как использовать системный вызов опроса на C

Как использовать системный вызов опроса на C
Функция poll () позволяет программам мультиплексировать ввод и вывод через ряд файловых дескрипторов. Другими словами, системный вызов poll () аналогичен системному вызову select () в работе, поскольку он удерживает свой огонь для одного из нескольких файловых дескрипторов, становясь доступным для ввода-вывода. Poll () проверяет назначенный дескриптор документа для перечисления событий в инцидентах для каждого элемента массива, указывающего на него дескрипторами файлов. Метод poll () может определить, какой из файловых дескрипторов программа будет читать или записывать сведения, которые видели эти инциденты. В этом руководстве мы будем использовать Ubuntu 20.04, чтобы понять концепцию системного вызова poll () в Linux, шаг за шагом.

Синтаксис:

int poll (struct pollfd * ufds, unsigned int nfds, int timeout);

Аргумент «fds» определяет дескрипторы документов, которые необходимо проверить, а также важные инциденты для каждого из них. Это ссылка либо на массив, который имеет по одному элементу для каждого дескриптора открытого документа. Элементами массива являются структуры pollfd, где fd обозначает дескриптор открытого документа, а все события и повторные события, обычно называемые битовыми масками, генерируются путем объединения соответствующих флагов событий:

ПОЛЛИН:

Помимо высокоприоритетных данных, информационные данные можно считывать, даже не блокируя их. Кроме того, если ответное сообщение имеет нулевой размер, этот флаговый сигнал генерируется для ПОТОКОВ в revents. Этот флаг имеет то же значение, что и POLLRDNORM | POLLRDBAND.

ПОЛЛРДНОРМ:

Можно без прерывания считывать обычные информационные данные. Информация о приоритетном диапазоне 0 может быть прочитана, несмотря на прерывание для ПОТОКОВ. И если ответное сообщение имеет нулевую длину, этот сигнал генерируется в повторных событиях.

POLLRDBAND:

Данные, вызывающие наибольшую озабоченность, будут считаны, несмотря на возникновение задержек. Информация о диапазонах приоритета больше нуля может быть прочитана, несмотря на вмешательство в ПОТОКИ. И если ответ на сообщение имеет нулевую длительность, этот сигнал распространяется в revents.

POLLPRI:

В дескрипторе документа могут быть исключения. Информация с наивысшим приоритетом может быть прочитана без блокировки. Кроме того, если ответ имеет нулевую длительность, этот сигнал распространяется для ПОТОКОВ в revents.

ЗАГРЯЗНЕНИЕ:

Пользователи могут писать, используя флаг POLLOUT. Без остановки, типичные данные могут быть записаны. Информация о предпочтительной полосе 0 может быть записана, несмотря на прерывание ПОТОКОВ.

POLLWRNORM:

Работает так же, как POLLOUT.

POLLWRBAND:

Данные с наибольшим приоритетом будут записаны с использованием этого флага. Информация о диапазонах предпочтений больше нуля для ПОТОКОВ может быть записана без блокировки. Это действие оценивает только диапазоны, которые уже были записаны хотя бы один раз, поскольку в этом ПОТОКЕ не было записано ни одного предпочтительного диапазона.

POLLERR:

Это состояние ошибки и возникает только тогда, когда система или поток столкнулись с проблемой. Этот символ применяется только к битовой маске revents; на протяжении всей деятельности участник упускается из виду.

ПОЛЛХУП:

Он указывает состояние зависания и возникает только тогда, когда соединение с системой было отключено. Это явление и ЗАГРЯЗНЕНИЕ в равной степени совместимы; как только возникла проблема, поток никогда не будет записан.

ПОЛЬНВАЛ:

Это указывает на недопустимый или необычный запрос. Тем не менее, эта деятельность не исключает участия в POLLIN, POLLRDNORM, POLLRDBAND или POLLPRI. Этот символ применяется только к битовой маске revents; не замечено у участника мероприятия.

Пример системного вызова опроса:

Он выполняет ту же роль, что и select (), но в большем масштабе. Poll () доступен на любой Linux-машине на базе Glibc. Старые ядра имитируют poll () с помощью select () во всей библиотеке C. Однако программы не должны делать различия. Вот пример того, как выглядит poll (). Поэтому сначала откройте терминал командной строки с помощью сочетания клавиш «Ctrl + Alt + T».«После его открытия мы должны создать файл C-типа, чтобы записать в него код C-типа. Для этого мы использовали редактор nano. Итак, попробуйте следующую команду nano в терминале вместе с именем файла C.

$ nano новый.c

Теперь редактор nano для файла C «новый» открыт. Вы должны сначала включить в него некоторые библиотеки, особенно «опрос.h ”библиотека. Основная функция была указана как имеющая целочисленный тип возвращаемого значения с двумя аргументами в параметре e.грамм., argc и argv. Затем мы объявили файловый дескриптор fd и массив символьных типов с именем «buf.После этого была определена переменная структурного типа с именем pollfd pfds размера 2. Затем был объявлен системный вызов open для получения значения из массива символьных типов и присвоения его файловому дескриптору «fd», как показано на изображении. Пока дескриптор файла равен «1», структура «pfds» будет обновлена ​​некоторыми данными в ней с использованием флага POLLIN внутри нее. Теперь мы определили функцию системного вызова poll (). Первый параметр системного вызова poll () - это структура ufds, используемая в коде. Второй параметр указывает общее количество структур pollfd в серии fds.

И последний параметр показывает значение тайм-аута целочисленного типа для системного вызова опроса. Если pfds повторяются и добавляются со значением 0, то системный вызов read считывает данные из буфера. Оператор «if» будет использоваться, чтобы проверить, вернул ли оператор чтения свое значение в виде целого числа и записать данные. Если структура «pfds» находится в позиции «1» во время повторения и ввода данных, системный вызов чтения будет использовать данные из буфера при использовании дескриптора «fd».

Сохраните новый.c файл и закройте его. Теперь скомпилируйте его с помощью компилятора gcc.

$ gcc новый.c

При выполнении этого кода мы добавили данные в опрос для считывания, и он снова записывает данные, как показано ниже.

$ ./ а.вне

Заключение:

В этой статье мы обсудили системный вызов poll () на языке C. Надеюсь, вы найдете это руководство полезным и эффективным при работе в операционной системе Linux.

Битва за Веснот 1.13.6 Выпущена разработка
Битва за Веснот 1.13.6, выпущенная в прошлом месяце, является шестой разработкой в ​​1.13.x и содержит ряд улучшений, в первую очередь пользовательско...
Как установить League Of Legends на Ubuntu 14.04
Если вы поклонник League of Legends, то это возможность для вас протестировать League of Legends. Обратите внимание, что LOL поддерживается в PlayOnLi...
Установите последнюю версию игры OpenRA Strategy в Ubuntu Linux
OpenRA - это игровой движок Libre / Free Real Time Strategy, воссоздающий ранние игры Westwood, такие как классическая Command & Conquer: Red Alert. Р...