La función dup2 en C
-
Utilizar la función
dup2
para duplicar un descriptor de archivo en C -
Utilice la función
dup
para duplicar un descriptor de fichero 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);
}
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