Programación en C

Función de lectura POSIX en programación C

Función de lectura POSIX en programación C
En los sistemas operativos tradicionales compatibles con POSIX, para obtener información de un documento contenido en un sistema de archivos, un programa utilizaba la llamada al sistema de lectura. Un descriptor de documento al que generalmente se accede desde una llamada anterior para abrir está definido por el archivo. Esta llamada al sistema de lectura lee la información en bytes y el número entero que la persona que llama especifica del documento, y luego lo guarda en un búfer proporcionado por el mecanismo de llamada.

Definición de función

Antes de definir la función de lectura en su código, debe incluir algunos paquetes obligatorios.

#incluir

Así es como se define la función de lectura POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t read (int fd, void * buf, size_t nbytes);

Se pueden tomar tres argumentos de parámetro de la llamada al método de lectura:

int fd: El descriptor de archivo del archivo desde donde se leerá la información. Podríamos estar usando un descriptor de archivo adquirido a través de una llamada al sistema abierto, o simplemente podríamos usar 0, 1 o 2 refiriéndose a una entrada típica, una salida regular o un error regular, respectivamente.

Vacío * buf: El búfer o la matriz de caracteres en la que se deben guardar y conservar los datos leídos.

Size_t nbyte: La cantidad de bytes que debían leerse del documento antes de truncar. Toda la información se puede almacenar en el búfer si la información a leer es más corta que nbytes.

Descripción

El método read () intenta leer bytes 'nbyte' en el caché del búfer al que se refiere 'buf' desde el archivo conectado con el descriptor de documento abierto 'Fildes' o 'fd'. No define la naturaleza de varias lecturas simultáneas en el mismo flujo, FIFO o unidad terminal.

En los documentos que permiten la lectura, el proceso de lectura comienza en el desplazamiento del documento y el desplazamiento se incrementa en el número de bytes leídos. Si el desplazamiento del documento está en o más allá del borde del archivo, no hay bytes leídos y read () no produce ninguno.

Cuando el recuento es 0, read () reconocerá los errores que se mencionan a continuación. Si no hay errores, o si read () no se contabiliza con Errores, read () arroja cero con un conteo de 0 y, por lo tanto, no tiene otras repercusiones.

Si el recuento es superior a SSIZE_MAX, según POSIX.1, entonces el resultado está determinado por la implementación.

Valor devuelto

El número de bytes 'leído' y 'preadido' revertidos tras el logro debe ser un número entero no negativo, mientras que cero apunta al final del archivo. La posición del documento avanza con este número, o de lo contrario, para indicar un error, los métodos devuelven -1 y asignan 'errno'. Cuando esta cifra es menor que el número de bytes solicitados, no es un byte de error. Es posible que haya menos bytes disponibles por ahora.

Errores

La función de lectura previa y lectura no tendrá éxito si se producen estos errores:

EAGAIN:

El documento o descriptor de archivo 'fd' pertenece a un archivo sin socket que ha sido etiquetado como no bloqueante (O NONBLOCK) y bloqueará la lectura.

EWOULDBLOCK:

El descriptor 'fd' pertenece a un conector que ha sido etiquetado como no bloqueante (O_NONBLOCK) y bloqueará la lectura.

EBADF:

Es posible que 'fd' no sea un descriptor utilizable o que no esté abierto para lectura.

EFAULT:

Esto sucede cuando su 'buf' está fuera de su espacio de direcciones accesible.

EINTR:

Antes de la lectura de los datos de información, es posible que la llamada se haya interrumpido por una señal.

EINVAL:

Este error ocurre cuando su descriptor 'fd' está involucrado en un objeto, que no es apropiado para leer, o el documento se desató con el indicador O_DIRECT, y una u otra dirección indicada en 'buf', el valor indicado en 'count ', o el desplazamiento del documento no está asociado correctamente.

EINVAL:

Es posible que el descriptor 'fd' se haya formado usando una llamada a timerfd_create (2), y se haya asignado un tamaño incorrecto de búfer para leer.

EIO:

Es un error de entrada / salida. Ocurre cuando el grupo de proceso en segundo plano intenta leer desde su terminal regulatorio, y uno u otro está pasando por alto o bloqueando SIGTTIN, o su grupo de proceso está en duelo. Otra razón para este error podría ser un error de entrada / salida de bajo nivel mientras se lee desde un disco duro o una cinta. Otra posible causa de EIO en archivos de datos en red es la eliminación del bloqueo de aviso en el descriptor de archivo y la falla de ese bloqueo.

EISDIR:

El descriptor de archivo 'fd' pertenece a un directorio.

Notas:

También pueden ocurrir muchos otros errores, dependiendo del objeto vinculado al descriptor 'fd'. Tanto los formularios size_t como ssize_t son tipos de datos numéricos sin marcar y marcados definidos por POSIX.1. En Linux, se pueden transmitir como máximo 0x7ffff000 (2,147,479,552) bytes mediante la función de lectura (y llamadas al sistema equivalentes), devolviendo el número de bytes transmitidos originalmente (en plataformas de 32 y 64 bits). Con los sistemas de archivos NFS, solo en el primer momento en que se cambia la marca de tiempo al leer pequeños flujos de información, las llamadas posteriores no lo harían. Se activa mediante el almacenamiento en caché de los atributos del lado del cliente ya que, aunque no todos, los clientes NFS dejan de actualizar al servidor a través de st_atime (última hora de acceso al archivo) y las lecturas del lado del cliente realizadas desde el búfer del cliente no activarían cambios en st- atime en el servidor ya que no hay lecturas del lado del servidor disponibles. Al eliminar el almacenamiento en caché de atributos del lado del cliente, se puede acceder a los metadatos de UNIX, pero esto aumentaría significativamente la carga en el servidor y afectaría la productividad en la mayoría de los casos.

Ejemplo 01:

Aquí hay un programa en C para demostrar la llamada a la función de lectura en el sistema Linux. Escriba el siguiente comando como está en un nuevo archivo. Agregue bibliotecas y, en la función principal, inicialice un descriptor y un tamaño. El descriptor abre el archivo y el tamaño se usa para leer los datos del archivo.

La salida para el código anterior sería como se muestra en la imagen de abajo.

Ejemplo 02:

Otro ejemplo para ilustrar el funcionamiento de la función de lectura se da a continuación.

Cree otro archivo y escriba el código a continuación tal como está en él. Aquí hay dos descriptores, fd1 y fd2, que tienen su propio acceso al archivo de tabla abierta. Entonces para foobar.txt, cada descriptor tiene su ubicación de archivo. El primer byte de foobar.txt se traduce de fd2, y el resultado es c = f, no c = o.

Conclusión

Hemos leído la función de lectura POSIX en la programación C de manera eficiente. Ojalá no queden dudas.

Controle y administre el movimiento del mouse entre múltiples monitores en Windows 10
Administrador de mouse de doble pantalla le permite controlar y configurar el movimiento del mouse entre varios monitores, al ralentizar sus movimient...
WinMouse le permite personalizar y mejorar el movimiento del puntero del mouse en una PC con Windows
Si desea mejorar las funciones predeterminadas del puntero del mouse, use el software gratuito WinMouse. Agrega más funciones para ayudarlo a aprovech...
El botón de clic izquierdo del mouse no funciona en Windows 10
Si está utilizando un mouse dedicado con su computadora portátil o computadora de escritorio, pero el el botón izquierdo del mouse no funciona en Wind...