Descriptor de archivo en C

Waqar Aslam 12 octubre 2023
  1. Una descripción general de los descriptores de archivos
  2. Descriptores de archivos en lenguaje de programación C
  3. Llamadas al sistema usando el descriptor de archivo en C
Descriptor de archivo en C

Este artículo discutirá el descriptor de archivo en el lenguaje de programación C.

Una descripción general de los descriptores de archivos

Un descriptor de archivo es un número que se puede usar para identificar un archivo abierto en el sistema operativo de una computadora de una manera única. Describe un recurso de datos y los métodos que se pueden utilizar para acceder a él.

Los descriptores de archivos nos proporcionan varios métodos, como open, close, read, y write para acceder a los archivos. Un descriptor de archivo es un número entero en su forma más básica.

Cada archivo que se abre recibe su número. Lo llamamos un descriptor de archivo.

Un descriptor de archivo es lo que devuelve la función open() después de que se haya utilizado para abrir un archivo. Una vez hecho esto, podemos utilizar este descriptor de archivo para realizar más acciones en ese archivo.

Por ejemplo, si deseamos leer datos del archivo abierto, proporcionamos el descriptor del archivo como entrada a la función que lee los datos.

Entrada de la tabla de archivos: cuando un proceso solicita abrir un archivo, las entradas de la tabla de archivos se forman como una estructura en la memoria que actúa como un proxy para el archivo abierto. Estas entradas son responsables de mantener la ubicación del archivo.

Descriptores de archivos en lenguaje de programación C

La entrada estándar (STDIN), la salida estándar (STDOUT) y el error estándar (STDERR) son los tres primeros descriptores de archivo que se utilizan de forma predeterminada en un sistema operativo similar a Unix.

Cuando comienza cualquier proceso, la tabla de descriptores de archivo para ese proceso se abre automáticamente con sus entradas fd (descriptor de archivo) 0, 1 y 2. Cada uno de estos tres fd hace referencia a un elemento en la tabla de archivos para un archivo llamado /dev/tty.

Nombre Descriptor de archivo Descripción
stdin 0 Entrada estándar
stdout 1 Salida estándar
stderr 2 Error estándar

Llamadas al sistema usando el descriptor de archivo en C

Una llamada al sistema es un método a través del cual un sistema operativo hace que sus servicios sean accesibles para las aplicaciones del usuario a través de una interfaz de programación de aplicaciones (API).

Los siguientes tipos de llamadas al sistema de E/S se utilizan en este contexto.

Llamada open() usando el descriptor de archivo

El nombre del archivo que desea abrir es lo que se envía como el primer parámetro de este método. Después de eso, ofrecemos algunas opciones más para determinar el modo de apertura.

El valor de retorno se establecerá en -1 si no puede abrir el archivo. Por lo tanto, antes de realizar más actividades en el archivo abierto, debemos verificar el valor devuelto por el método open().

Si tiene un valor de -1, sabemos que el método open() no pudo abrir el archivo con éxito.

Tomemos un ejemplo para implementar la llamada open().

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_CREAT | O_RDONLY)) == -1) {
    printf("File Open Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);
  }
}

Producción :

File Opened Successfully
File Descriptor: 3

Hemos definido una variable entera con el nombre fileDescriptor al principio de la función main. Esto se utilizará para almacenar el valor del descriptor de archivo.

Después de eso, usamos una declaración if para probar el valor devuelto por la función open. Si es -1, cerraremos la aplicación y mostraremos un mensaje de error.

De lo contrario, podremos continuar con el programa. La cadena abc.txt se envía como primera entrada a la función open.

Este es el nombre real del archivo que se está guardando. A continuación, hemos indicado que se debe utilizar O_RDONLY.

Esto indica que deseamos abrir el archivo en modo de solo lectura. Además, si el archivo no existe, debe crear el archivo usando O_CREAT.

Los siguientes son algunos otros argumentos que podemos utilizar.

  1. O_WRONLY: Esto abrirá el archivo para que solo puedas escribir en él.
  2. O_RDWR: Con esta opción, puede abrir archivos simultáneamente para leerlos y escribirlos.

Llamada close() usando el descriptor de archivo

Se hace para que se termine el acceso al sistema de archivos. Cuando un programa llama a esta función del sistema, indica que ya no necesita el archivo.

En consecuencia, los búferes se vacían, la información del archivo se modifica y los recursos asociados con el archivo se desasignan.

int close(int fd);

Llamada read() usando el descriptor de archivo

El descriptor de archivo es el primer parámetro que acepta. Como argumento, necesitaremos proporcionar el descriptor utilizado cuando se abrió el archivo.

Se envía un puntero como segundo parámetro. La función Leer obtendrá los datos del archivo especificado y los almacenará donde los haya dirigido.

Como valor de este puntero, podemos proporcionar la dirección del área de búfer que se asignó previamente. El tercer parámetro especifica el número de bytes que deben leerse del archivo.

Este archivo devuelve el número de bytes que se leyeron correctamente de este archivo si el archivo se leyó correctamente. Devolverá el valor -1 si no lo consigue.

Sintaxis:

ssize_t read(int fd, void *buf, size_t count);

Un ejemplo de lectura de un archivo utilizando un descriptor de archivo es el siguiente:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_RDONLY)) == -1) {
    printf("File Opening Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);

    if (read(fileDescriptor, buff, sizeof(buff)) == -1) {
      printf("Error while reading file\n");
      exit(0);
    } else {
      printf("Text of the File: %s\n", buff);
    }
  }
  return 0;
}

Producción :

File Opened Successfully
File Descriptor: 3
Text of the File: DelftStack has the solutions to all the programming-related problems
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

Artículo relacionado - C File