La función dup2 en C

Jinku Hu 12 octubre 2023
  1. Utilizar la función dup2 para duplicar un descriptor de archivo en C
  2. Utilice la función dup para duplicar un descriptor de fichero en C
La función dup2 en C

Este artículo explicará varios métodos de cómo usar la función dup2 en C.

Utilizar la función dup2 para duplicar un descriptor de archivo en C

Los archivos son normalmente manipulados después de haber sido abiertos usando la llamada al sistema open. En caso de éxito, open devuelve un nuevo descriptor de archivo asociado con el archivo recién abierto. En los sistemas basados en Unix, el sistema operativo mantiene una lista de archivos abiertos para cada programa en ejecución, llamada tabla de archivos. Cada entrada se representa con un entero de tipo int. Estos enteros se llaman descriptores de archivo en estos sistemas, y muchas llamadas al sistema toman los valores de los descriptores de archivo como parámetros.

Cada programa en ejecución tiene tres descriptores de archivo abiertos por defecto cuando se crea el proceso, a menos que se decida cerrarlos explícitamente. La función dup2 crea una copia del descriptor de fichero dado y le asigna un nuevo entero. dup2 toma como primer parámetro un descriptor de fichero antiguo a clonar y el segundo parámetro es el entero de un nuevo descriptor de fichero. Como resultado, ambos descriptores de archivo apuntan al mismo archivo y pueden usarse indistintamente. Tenga en cuenta que si el usuario especifica un entero utilizado actualmente por el archivo abierto como segundo parámetro, éste se cerrará y se reutilizará como el descriptor de archivo clonado.

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

extern int counter;

int main(void) {
  int fd = open("tmp.txt", O_WRONLY | O_APPEND);

  printf("tmp.txt fd = %d\n", fd);
  dup2(fd, 121);
  dprintf(121, "This string will be printed in tmp.txt file\n");

  exit(EXIT_SUCCESS);
}

Resultado:

tmp.txt fd = 3

El ejemplo anterior demuestra el uso básico de la función dup2, donde un archivo arbitrario llamado tmp.txt se abre en modo append, y se escribe en él algún texto con formato. El descriptor de fichero por defecto es el 3 devuelto por la llamada al sistema open. Después de ejecutar la llamada a la función dup2 con el segundo argumento de 121, el mismo archivo puede ser direccionado usando el nuevo descriptor de archivo. En consecuencia, llamamos a la función dprintf, que es similar a la función printf excepto que toma un argumento adicional del descriptor de archivo que especifica el destino para escribir la salida.

Utilice la función dup para duplicar un descriptor de fichero en C

Alternativamente, otra función llamada dup hace la clonación de descriptores de fichero de forma similar a dup2. Aunque, la función dup toma un solo argumento del descriptor de archivo a copiar y devuelve el recién creado automáticamente. El siguiente ejemplo demuestra el uso de dup, donde almacenamos el valor devuelto en un tipo int y luego pasamos la función dprintf al descriptor de archivo recuperado. Tenga en cuenta que el usuario es responsable de implementar las rutinas de comprobación de errores para ambas funciones para verificar la ejecución exitosa. Vea la página del manual de dup/dup2 para los detalles específicos aquí.

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

extern int counter;

int main(void) {
  int fd = open("tmp2.txt", O_WRONLY | O_APPEND);

  printf("tmp2.txt fd = %d\n", fd);
  int dup_fd = dup(fd);
  dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C File