Llamada al sistema Linux dup() y dup2()

dup()

La llamada al sistema dup() crea una copia de un descriptor de archivo.

  • Utiliza el descriptor no utilizado con el número más bajo para el nuevo descriptor.
  • Si la copia se crea correctamente, los descriptores de archivo original y de copia se pueden usar indistintamente.
  • Ambos se refieren a la misma descripción de archivo abierto y, por lo tanto, comparten indicadores de estado de archivo y compensación de archivo.

Sintaxis:

int dup(int oldfd);
oldfd: old file descriptor whose copy is to be created.
// CPP program to illustrate dup() 
#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>
  
int main()
{
    // open() returns a file descriptor file_desc to a 
    // the file "dup.txt" here"
  
    int file_desc = open("dup.txt", O_WRONLY | O_APPEND);
      
    if(file_desc < 0)
        printf("Error opening the file\n");
      
    // dup() will create the copy of file_desc as the copy_desc
    // then both can be used interchangeably.
  
    int copy_desc = dup(file_desc);
          
    // write() will write the given string into the file
    // referred by the file descriptors
  
    write(copy_desc,"This will be output to the file named dup.txt\n", 46);
          
    write(file_desc,"This will also be output to the file named dup.txt\n", 51);
      
    return 0;
}

Tenga en cuenta que este programa no se ejecutará en el compilador en línea, ya que incluye abrir un archivo y escribir en él.

Explicación: open() devuelve un descriptor de archivo file_desc al archivo llamado «dup.txt». file_desc se puede usar para realizar alguna operación de archivo con el archivo «dup.txt». Después de usar la llamada al sistema dup(), se crea una copia de file_desc copy_desc. Esta copia también se puede utilizar para realizar alguna operación de archivo con el mismo archivo «dup.txt». Después de dos operaciones de escritura, una con file_desc y otra con copy_desc, se edita el mismo archivo, es decir, «dup.txt».

Antes de ejecutar el código, deje que el archivo «dup.txt» antes de la operación de escritura sea como se muestra a continuación:

Después de ejecutar el programa C que se muestra arriba, el archivo «dup.txt» es como se muestra a continuación:

dup2()

La llamada al sistema dup2() es similar a dup() pero la diferencia básica entre ellos es que en lugar de usar el descriptor de archivo sin usar con el número más bajo, usa el número de descriptor especificado por el usuario.
Sintaxis:

int dup2(int oldfd, int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

Puntos importantes:

  • Incluya el archivo de encabezado unistd.h para usar la llamada al sistema dup() y dup2().
  • Si el descriptor newfd estaba abierto previamente, se cierra silenciosamente antes de reutilizarse.
  • Si oldfd no es un descriptor de archivo válido, la llamada falla y newfd no se cierra.
  • Si oldfd es un descriptor de archivo válido y newfd tiene el mismo valor que oldfd, entonces dup2() no hace
    nada y devuelve newfd.


Un uso engañoso de la llamada al sistema dup2():
Al igual que en dup2(), en lugar de newfd se puede colocar cualquier descriptor de archivo. A continuación se muestra una implementación de C en la que se utiliza el descriptor de archivo de salida estándar (stdout). Esto conducirá a que todas las instrucciones printf() se escriban en el archivo al que hace referencia el descriptor de archivo anterior.

// CPP program to illustrate dup2() 
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
  
int main()
{
    int file_desc = open("tricky.txt",O_WRONLY | O_APPEND);
      
    // here the newfd is the file descriptor of stdout (i.e. 1)
    dup2(file_desc, 1) ; 
          
    // All the printf statements will be written in the file
    // "tricky.txt"
    printf("I will be printed in the file tricky.txt\n");
      
return 0;
}

Esto se puede ver en la figura que se muestra a continuación:
Deje que el archivo «tricky.txt» antes de la operación dup2() sea como se muestra a continuación:

Después de ejecutar el programa C que se muestra arriba, el archivo «tricky.txt» es como se muestra a continuación:

Referencia: dup(2) – página man de Linux

Este artículo es una contribución de MAZHAR IMAM KHAN . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *