En sistemas operativos similares a Unix, las llamadas al sistema dup (abreviatura de "duplicado") y dup2 crean una copia de un descriptor de archivo determinado . Este nuevo descriptor en realidad no se comporta como una copia, sino como un alias del anterior.
Definición de POSIX de la biblioteca C
Las llamadas dup y dup2 están estandarizadas por la especificación POSIX . [1]
int dup ( int oldfd ); int dup2 ( int oldfd , int newfd );
El primero asigna el primer descriptor disponible, al igual que se comporta open () ; una forma alternativa de duplicar un descriptor de archivo en un lugar no especificado es la llamada al sistema fcntl con F_DUPFD
comando.
Este último coloca la copia en newfd. Si newfd está abierto, primero se cierra .
dup2 para redirección de entrada / salida
Uso de shells de Unixdup2 para la entrada / salida de redirección . Junto con pipe()
, es una herramienta en la que se basan las tuberías de Unix .
El siguiente ejemplo usa pipe()
y dup()
para conectar dos procesos separados ( programa1 y programa2 ) usando tuberías Unix :
#include #include #include / * prototipos de funciones * / void die ( const char * ); int main ( int argc , char ** argv ) { int pdes [ 2 ]; pid_t niño ; if ( tubería ( pdes ) == -1 ) die ( "tubería ()" ); niño = tenedor (); if ( child == ( pid_t ) ( -1 )) die ( "fork ()" ); / * bifurcación fallida * / if ( child == ( pid_t ) 0 ) { / * proceso hijo * / cerrar ( 1 ); / * cerrar stdout * / if ( dup ( pdes [ 1 ]) == -1 ) die ( "dup ()" ); / * ahora stdout y pdes [1] son equivalentes (dup devuelve el descriptor libre más bajo) * / if (( execlp ( "programa1" , "programa1" , "arg1" , NULL )) == -1 ) die ( "execlp ()" );_exit ( EXIT_SUCCESS ); } else { / * proceso principal * / cerrar ( 0 ); / * cerrar stdin * / if ( dup ( pdes [ 0 ]) == -1 ) die ( "dup ()" ); / * ahora stdin y pdes [0] son equivalentes (dup devuelve el descriptor libre más bajo) * / if (( execlp ( "programa2" , "programa2" , "arg1" , NULL )) == -1 ) die ( "execlp ()" );salir ( EXIT_SUCCESS ); } return 0 ; }void die ( const char * msg ) { perror ( msg ); salir ( EXIT_FAILURE ); }
Ver también
- Descriptor de archivo : cómo funciona y otras funciones relacionadas con abrir
Referencias
- ^ "dup, dup2" . opengroup.org .
- Programación avanzada en el entorno UNIX por W. Richard Stevens ISBN 81-7808-096-6