"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > OBTÉN LA SIGUIENTE LÍNEA Un proyecto para aprender cómo manejar los descriptores de archivos y las E/S del sistema

OBTÉN LA SIGUIENTE LÍNEA Un proyecto para aprender cómo manejar los descriptores de archivos y las E/S del sistema

Publicado el 2024-11-07
Navegar:117

En el ámbito de la programación en C, gestionar eficazmente la entrada, la salida y la memoria es fundamental. Para ayudarlo a comprender estos conceptos críticos, get_next_line es un proyecto en el que escribirá una función que lee un archivo línea por línea usando un descriptor de archivo. Cada invocación de la función lee la siguiente línea del archivo, lo que le permite procesar todo el contenido del archivo, una línea a la vez.

Comprender los descriptores de archivos y las E/S en un sistema

¿Qué es un descriptor de archivo?

Un descriptor de archivo es un número entero no negativo que identifica de forma única un archivo abierto en un sistema. Cuando un programa abre un archivo, el sistema operativo devuelve un descriptor de archivo que puede usarse para hacer referencia a ese archivo en operaciones posteriores, como leer, escribir o cerrar el archivo. Los descriptores de archivos son una abstracción utilizada por el sistema operativo para administrar varios recursos de E/S, incluidos archivos, sockets y canalizaciones.

0, 1 y 2 (entrada estándar, salida estándar y error estándar) en el Proceso A son independientes y están separados de los descriptores de archivo en el Proceso B. Este aislamiento garantiza que las operaciones de archivos en un proceso no interfieran con aquellas en otro.

tabla de descriptores de archivos

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

Cada descriptor de archivo está asociado con una entrada de la tabla de descriptores de archivo que contiene información esencial sobre el archivo. Esto incluye la ruta del archivo, los permisos de acceso y el desplazamiento actual, que rastrea la posición dentro del archivo para operaciones de lectura/escritura. Esta estructura permite que el sistema operativo administre múltiples archivos abiertos de manera eficiente y garantice el acceso y la manipulación de datos correctos.

Tenga en cuenta que el sistema operativo reserva los descriptores de archivo 0, 1 y 2 para transmisiones estándar. El descriptor de archivo 0 se utiliza para la entrada estándar (stdin), que normalmente representa la entrada desde el teclado. El descriptor de archivo 1 se utiliza para la salida estándar (stdout), que representa la salida a la pantalla o terminal. El descriptor de archivo 2 se utiliza para el error estándar (stderr), que también representa la salida a la pantalla o al terminal, pero está diseñado específicamente para mensajes de error. Estos descriptores de archivos reservados garantizan que las operaciones básicas de entrada y salida se puedan gestionar de forma coherente en diferentes programas y entornos. Cualquier descriptor de archivo devuelto por la función de apertura será 3 o superior, lo que garantiza que no entre en conflicto con estas secuencias estándar.

cómo abrir un archivo

ejemplo

'#include '
'#include '

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}




desglose del código

Un descriptor de archivo, representado como un número entero, se obtiene usando la función open, que toma dos parámetros: el nombre del archivo (o ruta) y las banderas que determinan los permisos de acceso al archivo. Por ejemplo, para leer el contenido de un archivo, usamos el indicador O_RDONLY (solo lectura). Para leer y escribir, usamos el indicador O_RDWR. Si bien hay muchas opciones disponibles, usaremos solo O_RDONLY para este proyecto. La función de apertura devuelve un número entero no negativo, que es el descriptor del archivo si la operación es exitosa; de lo contrario, devuelve -1 para indicar un error (no tienes permiso para acceder a ejemplo.txt). Tenga en cuenta que la función de apertura está en la biblioteca unistd.h y los indicadores de permiso están definidos en fcntl.h.

lectura de un descriptor de archivo

ejemplo

'#include '
'#include '
'#include '
'#define BUFFER_SIZE 4'

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);




descomponer

resultado del código

1.ª llamada: HEL
2.ª convocatoria: LO
3.ª convocatoria: TRABAJO
4ta convocatoria : LD
5ta convocatoria: (nula)

La función de lectura, proporcionada por la biblioteca unistd.h, se utiliza para leer datos de un descriptor de archivo. Se necesitan tres parámetros: el descriptor del archivo, un búfer para almacenar los datos leídos y el número de bytes para leer del archivo. La función de lectura devuelve el número de bytes leídos del archivo.

En la tabla de descriptores de archivos, hay un atributo llamado desplazamiento. El desplazamiento realiza un seguimiento de la posición actual dentro del archivo. Cada vez que se llama a la función de lectura, lee datos a partir del desplazamiento actual y luego avanza el desplazamiento según el número de bytes leídos. Esto garantiza que las lecturas posteriores continúen desde donde terminó la última lectura.

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

En nuestro ejemplo:

  • La primera llamada a lectura lee los primeros 3 bytes del archivo y los almacena en el búfer, comenzando desde el principio del archivo (desplazamiento 0). Luego, el desplazamiento se actualiza a 3.
  • La segunda llamada a lectura lee los siguientes 3 bytes a partir del desplazamiento actualizado (3) y luego actualiza el desplazamiento a 6.
    etc ...

  • La quinta llamada al búfer de lectura será nula y la lectura devuelve 0, lo que indica el final del archivo.

Este proceso continúa hasta que se hayan leído todos los datos del archivo o se produzca un error. El búfer termina en nulo después de cada lectura para garantizar que se pueda imprimir como una cadena.

EL PROBLEMA

char *get_next_line(int fd) toma como parámetro un descriptor de archivo de un archivo y devuelve una línea para cada llamada. Si llega al final del archivo, devuelve NULL.

Parámetros

  • fd: Descriptor del archivo a leer.
  • BUFFER_SIZE: el tamaño del búfer utilizado para leer fragmentos del archivo. su programa no debería tener fugas.

Solución :

https://github.com/Its-JoeTheKing/get_next_line

Declaración de liberación Este artículo se reproduce en: https://dev.to/aerrfig/get-next-line-a-42-project-to-learn-how-to-deal-with-file-descriptors-and-io-of- system- 3652 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3