Pregunta

dup / dup2 hace, pero tengo ni idea de cuándo sería utilizada.

Cualquier ejemplos prácticos?

Gracias.

¿Fue útil?

Solución

Un ejemplo de uso sería I / O redirección. Por esta desembolsar un proceso hijo y cerrar el stdin o stdout descriptores de fichero (0 y 1) y luego haces un dup () en otro descriptor de fichero de su elección que ahora va a proyectar en el descriptor de archivo más bajo disponible, que es en este caso 0 o 1.

El uso de este ahora se puede exec cualquier proceso hijo que es posiblemente inconsciente de su aplicación y cada vez que el niño escribe en la salida estándar (o lee de la entrada estándar, lo que configuró) los datos se escribe en el descriptor de archivo proporcionado en su lugar.

Shells usan esto para implementar comandos con tubos, por ejemplo /bin/ls | more conectando la salida estándar de un proceso a la entrada estándar de la otra.

Otros consejos

El mejor escenario para comprender DUP y dup2 es la redirección.
Lo primero que necesitamos saber es que el sistema tiene 3 identificadores de archivo por defecto (o variables que indican las fuentes de salida o de entrada) que se ocupa de la entrada y la salida. Son stdin, stdout, stderr, en números enteros que son 0, 1, 2. La mayor parte de las funciones como fprintf o cout son directamente salida a stdout.
Si queremos redirigir la salida, una forma es dar, por ejemplo, fprintf funcionar más argumentos que indican in y out.
Sin embargo, hay una manera más elegante: se puede sobreescribir los identificadores de archivo por defecto para que se apunta al archivo que queremos para recibir la salida. dup y dup2 exactamente trabajar en esta situación.
Vamos a empezar con un ejemplo sencillo ahora: supongamos que queremos redirigir la salida de fprintf a un archivo txt llamado "chinaisbetter.txt". En primer lugar tenemos que abrir este archivo

int fw=open("chinaisbetter.txt", O_APPEND|O_WRONLY);

A continuación, queremos stdout a punto mediante el uso de la función dup a "chinaisbetter.txt":

dup2(fw,1);

Ahora la salida estándar (1) señala que el descriptor de "chinaisbetter.txt" a pesar de que todavía es 1, pero la salida se redirige ahora.
A continuación, puede utilizar printf como normal, pero los resultados estarán en el archivo txt en lugar de mostrar directamente en la pantalla:

printf("Are you kidding me? \n");

PS

  1. Esto sólo da una explicación intuitiva, puede que tenga que comprobar la información detallada página de manual o. En realidad, decimos "copia" aquí, no está copiando todo.

  2. El ID archivo aquí se está refiriendo al manejador del archivo. El descriptor de fichero mencionado anteriormente es una estructura de información del archivo de registros.

Cuando eres curioso acerca de las funciones POSIX, especialmente aquellas que parecen duplicarse a sí mismas, por lo general es bueno compruebe la propia norma . En la parte inferior se le suele ver ejemplos, así como el razonamiento detrás de la aplicación (y la existencia) de ambos.

En este caso:

Las siguientes secciones son informativos.

Ejemplos

Redirección de la salida estándar a un archivo

En el siguiente ejemplo se cierra la salida estándar de los procesos actuales, re-asigna la salida estándar para ir al archivo referenciado por pfd, y cierra el descriptor de archivo original para limpiar.

#include <unistd.h>
...
int pfd;
...
close(1);
dup(pfd);
close(pfd);
...

Redirección de mensajes de error

El siguiente ejemplo redirecciona los mensajes de stderr a stdout.

#include <unistd.h>
...
dup2(2, 1); // 2-stderr; 1-stdout
...

Uso Application

Ninguno.

Justificación

Las funciones dup() y dup2() son redundantes. Sus servicios también son proporcionados por la función fcntl(). Se han incluido en este volumen de IEEE Std 1003.1-2001 principalmente por razones históricas, ya que muchas aplicaciones existentes los utilizan.

Mientras que el segmento de código breve mostrado es muy similar en comportamiento a dup2(), una implantación conforme basado en otras funciones definidas en este volumen de IEEE Std 1003.1-2001 es significativamente más complejo. Menos obvio es el posible efecto de una función capturadora de señales que pueda ser invocada entre los pasos y asignar o desasignar descriptores de fichero. Esto podría evitarse mediante el bloqueo de señales.

La función dup2() no está marcado obsoleto debido a que presenta una versión de tipo seguro de la funcionalidad proporcionada en una versión de tipo inseguro por fcntl(). Se utiliza en la unión del POSIX Ada.

La función dup2() no está destinado para su uso en regiones críticas como un mecanismo de sincronización.

En la descripción de [EBADF], el caso de Fildes están fuera del rango cubierto por el caso dado de Fildes no ser válido. Las descripciones de los fildes y fildes2 son diferentes porque el único tipo de invalidez que es relevante para fildes2 es si está fuera de rango; es decir, que no importa si fildes2 se refiere a un archivo abierto cuando se realiza la llamada dup2().

Future Directions

Ninguno.

Ver también

close(), fcntl(), open(), las definiciones Base volumen de IEEE Std 1003.1-2001, <unistd.h>

Historial de cambios

Por primera vez en Número 1. Derivado de Emisión 1 de la SVID.

Un ejemplo práctico es redirigir mensajes de salida a alguna otra corriente como un archivo de registro. Aquí es un código de ejemplo para la redirección de E / S.
Por favor refiérase a la publicación original aquí

#include <stdio.h>

main()
{
    int    fd;
    fpos_t pos;

    printf("stdout, ");

    fflush(stdout);
    fgetpos(stdout, &pos);
    fd = dup(fileno(stdout));
    freopen("stdout.out", "w", stdout);

    f();

    fflush(stdout);
    dup2(fd, fileno(stdout));
    close(fd);
    clearerr(stdout);
    fsetpos(stdout, &pos);        /* for C9X */

    printf("stdout again\n");
}

f()
{
printf("stdout in f()");
}

I / O de redirección en la cáscara lo más probable ser implementado utilizando las llamadas al sistema dup2 / fcnlt.

Podemos emular fácilmente el tipo de $program 2>&1 > logfile.log redirección utilizando la función dup2.

El programa siguiente redirige tanto stdout y stderr .i.e emula el comportamiento de $program 2>&1 > output usando el dup2.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int
main(void){
    int close_this_fd;
    dup2(close_this_fd = open("output", O_WRONLY), 1);
    dup2(1,2);
    close(close_this_fd);
    fprintf(stdout, "standard output\n");
    fprintf(stderr, "standard error\n");
    fflush(stdout);
    sleep(100); //sleep to examine the filedes in /proc/pid/fd level.
    return;
}

vagrant@precise64:/vagrant/advC$ ./a.out
^Z
[2]+  Stopped                 ./a.out
vagrant@precise64:/vagrant/advC$ cat output
standard error
standard output
vagrant@precise64:/vagrant/advC$ ll /proc/2761/fd
total 0
dr-x------ 2 vagrant vagrant  0 Jun 20 22:07 ./
dr-xr-xr-x 8 vagrant vagrant  0 Jun 20 22:07 ../
lrwx------ 1 vagrant vagrant 64 Jun 20 22:07 0 -> /dev/pts/0
l-wx------ 1 vagrant vagrant 64 Jun 20 22:07 1 -> /vagrant/advC/output
l-wx------ 1 vagrant vagrant 64 Jun 20 22:07 2 -> /vagrant/advC/output
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top