Función de lectura POSIX en programación C

Posix Read Function C Programing



En los sistemas operativos tradicionales compatibles con POSIX, para obtener información de un documento contenido en un sistema de archivos, un programa usaba la llamada al sistema de lectura. El archivo define un descriptor de documento al que normalmente se accede desde una llamada anterior para abrir. 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(En tMarfil,vacío *buf,size_tnbyte, off_t offset);
>>ssize_t leer(En tfd,vacío *buf,size_tnbytes);

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 matriz de caracteres en el que se deben guardar y conservar los datos leídos.

Size_t nbyte: El número de bytes que se deben leer del documento antes de truncarlo. Toda la información se puede almacenar en el búfer si la información a leer es menor que nbytes.



Descripción

El método read () intenta leer 'nbyte' bytes 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 el borde del archivo o más allá, 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, la implementación determina el resultado.

Valor devuelto

La cantidad de bytes 'leídos' y 'predispuestos' 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 progresa 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 por ahora haya menos bytes disponibles.

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 el '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.

SELECCIÓN:

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.

SELECCIÓN:

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

EIO:

Es un error de entrada / salida. Ocurre cuando el grupo de procesos en segundo plano intenta leer desde su terminal regulador, y uno u otro está pasando por alto o bloqueando SIGTTIN, o su grupo de procesos 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 leyendo la función (y llamadas al sistema equivalentes), devolviendo el número de bytes transmitidos originalmente (tanto en plataformas de 32 bits como de 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 tal como está en un archivo nuevo. 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:

A continuación se ofrece otro ejemplo para ilustrar el funcionamiento de la función de lectura.

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 de C de manera eficiente. Con suerte, no quedan dudas.