stdin: Este es el descriptor de archivo de entrada estándar. Se usa para tomar la entrada del terminal de forma predeterminada. scanf (), getc () Las funciones de etc. usan stdin Descriptor de archivo para tomar entradas de usuario. El 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 de forma predeterminada. El ampliamente utilizado printf () utiliza la función stdout Para imprimir la salida deseada en la consola/terminal. El 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. El stderr El descriptor de archivo se usa para imprimir mensajes de error en la consola/terminal. La única diferencia es si usas 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 salidas normales a la consola u otro archivo. El stderr El descriptor de archivo también está representado por el número 2.
Aparte de estos 3 descriptores de archivos, puede crear descriptores de archivos adicionales en C. Para crear un nuevo descriptor de archivo, puede usar el abierto() función en c. El abierto() La función abre un archivo nuevo, crea un descriptor de archivo para ese archivo y adjunta un número que no sea 0, 1, 2 al descriptor del archivo.
Una vez que abra un archivo usando abierto() función, puede usar el leer() y escribir() función para leer y escribir en el descriptor de archivos recién creado.
Ahora, imagine una situación en la que desea leer de un archivo específico usando scanf () o getc () función y escribir a otro archivo usando printf () función. Este no es el comportamiento predeterminado del scanf (), getc () y printf () Funciones como expliqué anteriormente. Por defecto, scanf () y getc () utiliza la función stdin y printf () usos stdout y no hay forma de decir estas funciones que usen otros descriptores de archivos. Entonces, para alterar este comportamiento predeterminado, debe reemplazar el stdin y stdout Descriptores de archivos con los descriptores de archivos deseados. Esto es lo que el dup2 () La función del sistema lo hace. El dup2 () La función copia un descriptor de archivo a otro descriptor de archivo.
sintaxis dup2 () y valor de retorno:
La sintaxis de dup2 () la función es:
int dup2 (intdup2 () la función copia el Old_file_descriptor en el new_file_descriptor. Si el new_file_descriptor ya existe, luego está cerrado automáticamente y luego el Old_file_descriptor se lo copia.
Sobre el éxito, el dup2 () La función devuelve el nuevo descriptor de archivo. Si ocurre un error, dup2 () devoluciones -1.
El dup2 () la función se define en el archivo de encabezado unistd.H.
Debes incluir el encabezado unistd.H en su archivo fuente C para usar el dup2 () función de la siguiente manera:
#incluirPara obtener más información, consulte la página del hombre de dup2 () Con el siguiente comando:
$ hombre dup2
Ejemplo 1:
Crear un nuevo archivo de origen C 01_DUP2.C y escriba las siguientes líneas de códigos en el archivo.
#incluirAhora, crea un nuevo archivo aporte.TXT en el mismo directorio y escriba la siguiente línea en él.
15 41El objetivo principal de este programa es leer 2 números enteros del aporte.TXT archivo usando scanf () función, agrégalos e imprima la suma.
Primero, incluí los archivos de encabezado requeridos con las siguientes líneas de códigos.
#incluirEn 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 el abierto() función y almacenado el descriptor de archivo en la variable Input_fds.
int input_fds = Open ("./aporte.txt ", o_rdonly);Una vez que tengo 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 es ahora el predeterminado stdin descriptor de archivo.
dup2 (input_fds, stdin_fileno)También podría escribir el dup2 () funcionar de la siguiente manera. El resultado sería el mismo. Stdin_fileno posee el valor 0, ¿Cuál es el valor del stdin descriptor de archivo.
dup2 (input_fds, 0)También revisé dup2 () Errores con las siguientes líneas. Si se produce un error, el programa está configurado para imprimir un mensaje de error y salir.
if (dup2 (input_fds, stdin_fileno) < 0)Entonces, usé scanf () para escanear 2 números del aporte.TXT archivo.
scanf (" %d %d", y número1, y número2);Luego, agregué los números e imprimí la suma en la consola/terminal, el valor predeterminado stdout.
suma = número1 + número2;Como puede ver, obtuve el resultado esperado una vez que ejecuto el programa.
Ejemplo 2:
Crear un nuevo archivo de origen C 02_DUP2.C y escriba las siguientes líneas de códigos en el archivo.
#incluirAhora, crea un nuevo archivo aporte.TXT en el mismo directorio y escriba la siguiente línea en él.
15 41En 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 el valor predeterminado stdout Descriptor de archivo utilizando el dup2 () función. Ahora, toda la salida del printf () la función se escribirá en el producción.TXT archivo.
Creé un nuevo archivo y almacené el descriptor de 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 del archivo stdout. Usé la constante predefinida Stdout_fileno.
dup2 (output_fds, stdout_fileno);Stdout_fileno contiene el valor 1 (el valor de descriptor de archivo predeterminado de stdout). Entonces, podría reescribir la llamada de función dup2 () de la siguiente manera. Daría los mismos resultados.
dup2 (output_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 archivo.
Como puede ver, la salida se escribe en el archivo producción.TXT.
Si quieres escribir todos los errores (stderr) a otro archivo, entonces 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 del sistema en c. Gracias por leer este artículo.