Epoll 7 C función

El lenguaje C es un lenguaje muy rico a la hora de utilizar diferentes tecnologías o APIs. También es muy útil cuando queremos utilizar la programación por socket. Es lo mismo con las funciones de epoll 7. Poll(2) y la API epoll monitorean los diversos descriptores de documentos para determinar si la E/S es factible en cada uno de ellos. La API de epoll se combina muy bien con la gran cantidad de descriptores de documentos monitoreados y se puede usar como un indicador de nivel o una puerta de enlace de indicador de borde. La entidad epoll, un modelo de información del kernel que se puede ver desde el espacio del usuario como un envoltorio para dos conjuntos, sirve como idea básica de la API epoll. En esta guía, discutiremos el uso de la función epoll en el lenguaje C.
- Lista de intereses: El grupo de interés, también conocido como colección epoll, es la colección de descriptores de documentos que el método ha indicado como interesados en rastrear. La colección de descriptores de documentos que parecen estar «listos» para la E/S se denomina cola de configuración completa.
- lista terminada: La colección de identificadores de documentos que están «listos» para E/S se denomina «lista lista». Los identificadores de documentos en la lista de interés son un subconjunto (o, más precisamente, una colección de punteros a) la lista lista. El núcleo utiliza operaciones de E/S en tales descriptores de documentos para llenar la lista de preparados periódicamente.
Las siguientes funciones del sistema están disponibles para crear y administrar un objeto epoll:
- Epoll_create(2): la función epoll create(2) inicia una nueva instancia del servicio epoll y devuelve un descriptor de archivo. (El epoll create1(2) más moderno amplía epoll create(2) (capacidad).)
- Epoll_ctl(2): aporta cosas a la lista de interés del objeto Epoll y luego se usa para registrar interés en descriptores de documentos específicos.
- Epoll_wait(2): si no hay actividad de E/S en este momento, epoll wait(2) bloquea el subproceso que lo llamó. (Se puede considerar que esta llamada al sistema recopila cosas de la lista lista del objeto epoll).
Contenidos
Activado por nivel y activado por borde
Los comportamientos activados por borde (ET) y activados por nivel (LT) son posibles para la interfaz de circulación de incidentes (LT) de epoll. Las diferencias entre los dos métodos se pueden resumir de la siguiente manera. Supongamos que sucede lo siguiente:
- El lado de lectura del descriptor de documento (RFD) de una tubería se ingresa en el objeto epoll.
- Un total de 2 KB de contenido escrito en el muro de escritura del contenedor por un autor de tubería.
- Se realiza una solicitud a epoll wait(2) y se devuelve RFD, un identificador de archivo preparado.
- El lector de canalización lee 1 kilobyte de contenido del RFD.
- Se realiza una llamada a la función epoll_wait(2).
Es probable que la solicitud epoll_wait(2) realizada en el paso 5 falle si el identificador del documento RFD se ha asignado al protocolo epoll con la señal EPOLLET (activada por borde). Mientras tanto, el socio remoto puede esperar una respuesta según el contenido que ya haya entregado. Esto se debe a que la opción activada por borde envía señales solo cuando el descriptor del documento observado experimenta cambios. Por lo tanto, es posible que deba detenerse la función de llamada incluso para cierta información que ya está en el caché del búfer en la fase 5. El incidente se recibe en la 3. La llamada a epoll_wait(2) en el paso 5 puede bloquearse porque la actividad de lectura en el paso 4 no usó toda la información del búfer. Para evitar que una lectura o escritura de bloqueo agote un trabajo que administra los diversos descriptores de archivos, un programa que use la opción EPOLLET debe usar los descriptores de documentos sin bloqueo. El siguiente es un procedimiento recomendado para usar epoll como una interfaz activada por borde (EPOLLET):
- Descriptores de documentos sin bloqueo y
- Entregue EAGAIN inmediatamente después de leer (2) o escribir (2), esperando una acción.
Epoll, por otro lado, es solo una versión más rápida de poll (2) y se puede usar en cualquier lugar donde se use poll (2), ya que tiene la misma lógica siempre que se considere un protocolo activado por nivel (el valor predeterminado cuando no se proporciona EPOLLET) . La función de llamada tiene la opción de proporcionar la señal EPOLONESHOT para decirle a epoll que cierre el descriptor de archivo asociado cuando se recibe una ocurrencia con epoll_wait. Mientras tanto, incluso con Epoll activado por borde, se pueden generar muchas acciones al recibir los múltiples conjuntos de información (2). La persona que llama realmente necesita volver a implementar el descriptor del documento con epoll_ctl(2) y EPOLL_CTL_MOD siempre que se proporcione el indicador EPOLONESHOT.
Ejemplo:
Aunque la lógica de epoll es idéntica a poll(2) cuando se usa como una API de umbral, su comportamiento activado por borde requiere una explicación más detallada para evitar los retrasos en la cola de eventos del programa. El oyente de esta figura es un socket sin bloqueo en el que se llama a la función listen(2). Antes de que EAGAIN sea proporcionado por la función read(2) o write(), el método usa la función fd() para mantener el nuevo descriptor de archivo listo (2). Una aplicación de máquina de estado controlada por eventos también podría guardar su estado actual después de recibir EAGAIN para que pueda continuar leyendo o escribiendo desde el punto anterior cuando fd() se llame nuevamente. Mira el código adjunto aquí:
Para mejorar la eficiencia, el descriptor de archivo dentro de la interfaz epoll (EPOLL CTL ADD) solo debe agregarse una vez marcando (EPOLLIN|EPOLOUT) como una interfaz activada por borde. Al ejecutar epoll ctl(2) con EPOLL CTL MOD, puede evitar el cambio constante entre EPOLLIN y EPOLOUT. El código restante de esta figura se adjunta en la siguiente imagen:
Conclusión:
Se trata de utilizar la función epoll 7 C en el sistema operativo Linux Ubuntu 20.04 para realizar la programación de sockets. Hemos discutido cómo se puede usar una función epoll() 7 C para verificar la viabilidad de los diversos descriptores de archivos para ver si las entradas y salidas que contienen son viables o no, tanto en el servidor como en el lado del cliente.