Programación en C

Llamada al sistema dup2 en C

Llamada al sistema dup2 en C
La dup2 () La función del sistema se utiliza para crear una copia de un descriptor de archivo existente. En Linux, hay 3 descriptores de archivos estándar. Ellos son:

stdin: Este es el descriptor de archivo de entrada estándar. Se utiliza para recibir datos del terminal de forma predeterminada. scanf (), getc () usos de funciones etc stdin descriptor de archivo para tomar las entradas del usuario. La stdin El descriptor de archivo también está representado por el número 0.

stdout: Este es el descriptor de archivo de salida estándar. Se usa para imprimir algo en la consola / terminal por defecto. El ampliamente utilizado printf () usos de la función stdout para imprimir la salida deseada en la consola / terminal. La stdout El descriptor de archivo también está representado por el número 1.

stderr: Este es el descriptor de archivo de error estándar. Hace lo mismo que el stdout descriptor de archivo. La stderr El descriptor de archivo se utiliza para imprimir mensajes de error en la consola / terminal. La única diferencia es si usa stderr descriptor de archivo para imprimir los mensajes de error, y stdout descriptor de archivo para imprimir salidas normales, luego puede separarlas. Por ejemplo, puede redirigir los mensajes de error a un archivo y las salidas normales a la consola u otro archivo. La stderr El descriptor de archivo también está representado por el número 2.

Aparte de estos 3 descriptores de archivo, puede crear descriptores de archivo adicionales en C. Para crear un nuevo descriptor de archivo, puede utilizar el abierto() función en C. La abierto() La función abre un nuevo archivo, crea un descriptor de archivo para ese archivo y adjunta un número que no sea 0, 1, 2 al descriptor de archivo.

Una vez que abra un archivo usando abierto() función, puede utilizar la leer() y escribir() función para leer y escribir en el descriptor de archivo recién creado.

Ahora, imagine una situación en la que desee leer de un archivo específico usando scanf () o getc () función y escribir en otro archivo usando printf () función. Este no es el comportamiento predeterminado del scanf (), getc () y printf () funciona como expliqué anteriormente. Por defecto, scanf () y getc () usos de la función stdin y printf () usos stdout y no hay forma de decirle a estas funciones que usen otros descriptores de archivo. Entonces, para modificar este comportamiento predeterminado, debe reemplazar el stdin y stdout descriptores de archivo con los descriptores de archivo que desee. Esto es lo que dup2 () la función del sistema hace. La dup2 () función copia un descriptor de archivo a otro descriptor de archivo.

dup2 () Sintaxis y valor de retorno:

La sintaxis de dup2 () la función es:

int dup2 (int descriptor_archivo_antiguo, int descriptor_archivo_nuevo);

dup2 () función copia el descriptor_archivo_antiguo en el new_file_descriptor. Si el new_file_descriptor ya existe, luego se cierra automáticamente y luego el descriptor_archivo_antiguo se copia en él.

En el éxito, el dup2 () función devuelve el nuevo descriptor de archivo. Si ocurre un error, dup2 () devoluciones -1.

La dup2 () la función está definida en el archivo de encabezado unistd.h.

Debes incluir el encabezado unistd.h en su archivo fuente C para usar el dup2 () funcionan de la siguiente manera:

#incluir

Para obtener más información, consulte la página de manual de dup2 () con el siguiente comando:

$ man dup2

Ejemplo 1:

Crea un nuevo archivo fuente en C 01_dup2.C y escriba las siguientes líneas de códigos en el archivo.

#incluir
#incluir
#incluir
#incluir
 
int main (void)
int número1, número2, suma;
 
int input_fds = open ("./aporte.txt ", O_RDONLY);
 
si (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("No se puede duplicar el descriptor de archivo.");
salir (EXIT_FAILURE);

 
scanf ("% d% d", & número1, & número2);
 
suma = número1 + número2;
 
printf ("% d +% d =% d \ n", número1, número2, suma);
 
return EXIT_SUCCESS;

Ahora, crea un nuevo archivo aporte.TXT en el mismo directorio y escriba la siguiente línea en él.

15 41

El principal objetivo de este programa es leer 2 números enteros de la aporte.TXT archivo usando scanf () función, agréguelos e imprima la suma.

Primero, incluí los archivos de encabezado requeridos con las siguientes líneas de códigos.

#incluir
#incluir
#incluir
#incluir

En el principal() función, definí las variables requeridas.

int número1, número2, suma;

Entonces, abrí el archivo aporte.TXT en modo de solo lectura (O_RDONLY) utilizando la abierto() función y almacenó el descriptor de archivo en la variable input_fds.

int input_fds = open ("./aporte.txt ", O_RDONLY);

Una vez que tenga el descriptor de archivo del aporte.TXT archivo, copié el descriptor de archivo en el descriptor de archivo de entrada estándar STDIN_FILENO (0) usando dup2 () función. El descriptor de archivo de aporte.TXT ahora es el predeterminado stdin descriptor de archivo.

dup2 (input_fds, STDIN_FILENO)

También podría escribir el dup2 () funciona de la siguiente manera. El resultado sería el mismo. STDIN_FILENO tiene el valor 0, cual es el valor de la stdin descriptor de archivo.

dup2 (input_fds, 0)

También revisé dup2 () errores con las siguientes líneas. Si ocurre un error, el programa está configurado para imprimir un mensaje de error y salir.

si (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("No se puede duplicar el descriptor de archivo.");
salir (EXIT_FAILURE);

Entonces, usé scanf () para escanear 2 números del aporte.TXT expediente.

scanf ("% d% d", & número1, & número2);

Luego, agregué los números e imprimí la suma en la consola / terminal, el valor predeterminado stdout.

suma = número1 + número2;
printf ("% d +% d =% d \ n", número1, número2, suma);

Como puede ver, obtuve el resultado esperado una vez que ejecuté el programa.

Ejemplo 2:

Crea un nuevo archivo fuente en C 02_dup2.C y escriba las siguientes líneas de códigos en el archivo.

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int main (void)
int número1, número2, suma;
int input_fds = open ("./aporte.txt ", O_RDONLY);
int output_fds = open ("./producción.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (salida_fds, STDOUT_FILENO);
scanf ("% d% d", & número1, & número2);
suma = número1 + número2;
printf ("% d +% d =% d \ n", número1, número2, suma);
return EXIT_SUCCESS;

Ahora, crea un nuevo archivo aporte.TXT en el mismo directorio y escriba la siguiente línea en él.

15 41

En este programa, hice lo mismo que en Ejemplo 1. La única diferencia es que creé un nuevo archivo producción.TXT y usó el descriptor de archivo de salida.txt como predeterminado stdout descriptor de archivo usando el dup2 () función. Ahora, toda la salida del printf () La función se escribirá en el producción.TXT expediente.

Creé un nuevo archivo y guardé el descriptor del archivo en output_fds variable.

int output_fds = open ("./producción.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

También copié el descriptor de archivo output_fds al descriptor de archivo stdout. Usé la constante predefinida STDOUT_FILENO.

dup2 (salida_fds, STDOUT_FILENO);

STDOUT_FILENO contiene el valor 1 (el valor de descriptor de archivo predeterminado de stdout). Entonces, podría reescribir la llamada a la función dup2 () de la siguiente manera. Daría los mismos resultados.

dup2 (salida_fds, 1);

El resto del programa es el mismo. Como puede ver, una vez que ejecuto el programa, no imprime nada en la consola / terminal.

Pero, el programa creó un nuevo archivo producción.TXT expediente.

Como puede ver, la salida se escribe en el archivo producción.TXT.

Si desea escribir todos los errores (stderr) a otro archivo, también puede copiar un descriptor de archivo a stderr descriptor de archivo de la siguiente manera.

dup2 (error_fds, STDERR_FILENO);

Entonces, así es como usas el dup2 () llamada al sistema en C. Gracias por leer este artículo.

Cómo usar GameConqueror Cheat Engine en Linux
El artículo cubre una guía sobre el uso del motor de trucos GameConqueror en Linux. Muchos usuarios que juegan juegos en Windows a menudo usan la apli...
Los mejores emuladores de consola de juegos para Linux
Este artículo enumerará el software de emulación de consola de juegos más popular disponible para Linux. La emulación es una capa de compatibilidad de...
Las mejores distribuciones de Linux para juegos en 2021
El sistema operativo Linux ha recorrido un largo camino desde su apariencia original, simple y basada en servidor. Este sistema operativo ha mejorado ...