exemples pratiques utiliser dup ou dup2

je sais ce que dup / dup2 Oui, mais je ne sais pas quand il sera utilisé.

des exemples pratiques?

Merci.

58
demandé sur Matheus Santana 2009-11-12 10:33:23

5 réponses

un exemple d'utilisation serait la redirection e/s. Pour cela, vous bifurquez un processus enfant et fermez les descripteurs de fichier stdin ou stdout (0 et 1), puis vous faites un dup () sur un autre descripteur de fichier de votre choix qui sera maintenant mappé sur le descripteur de fichier le plus bas disponible, qui est dans ce cas 0 ou 1.

en utilisant ceci vous pouvez maintenant exec n'importe quel processus enfant qui n'est peut-être pas au courant de votre application et chaque fois que l'enfant écrit sur le stdout (ou lit à partir de stdin, quelle que soit votre configuration, les données sont écrites sur le filedescriptor fourni à la place.

Shells utiliser cette pour mettre en œuvre des commandes avec des tuyaux, par exemple /bin/ls | more en reliant le stdout d'un processus au stdin de l'autre.

57
répondu Alfonso 2018-09-09 00:34:16

le meilleur scénario pour comprendre dup et dup2 est la redirection.

La première chose que nous devons savoir est que le système a 3 ID de fichier par défaut(ou variables indiquant la sortie ou les sources d'entrée) qui traite de l'entrée et la sortie. Ils sont stdin , stdout , stderr , en entier ils sont 0 , 1 , 2 . La plupart des fonctions comme fprintf ou cout sont directement sorties à stdout .

Si nous voulons rediriger la sortie, une façon est de donner, par exemple, fprintf fonction plus d'arguments indiquant in et out .

Cependant, il ya une façon plus élégante: nous pouvons remplacer le fichier par défaut id pour les faire pointer vers le fichier que nous voulons recevoir la sortie. dup et dup2 fonctionnent exactement dans cette situation.

Commençons par un exemple simple maintenant: supposons que nous voulons rediriger la sortie de fprintf vers un fichier txt nommé" chinaisbetter.txt". Tout d'abord nous avons besoin pour ouvrir ce fichier

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

puis nous voulons que stdout pointe vers "chinaisbetter.txt" en utilisant la dup de la fonction:

dup2(fw,1);

Maintenant, stdout(1) pointe vers le descripteur de "chinaisbetter.txt" même si c'est toujours 1, mais la sortie est redirigée maintenant.

Ensuite, vous pouvez utiliser printf comme d'habitude, mais les résultats seront le fichier txt au lieu d'afficher directement à l'écran:

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

PS :

  1. cela donne juste une explication intuitive, vous pouvez avoir besoin de vérifier la page de manuel ou des informations détaillées. En fait, on dit" Copier " ici, ils ne copient pas tout.

  2. l'id du fichier se réfère ici au gestionnaire du fichier. Le descripteur de fichier mentionné ci-dessus est une structure des informations du dossier des dossiers.

19
répondu ZijunLost 2016-12-30 23:05:54

lorsque vous êtes curieux au sujet des fonctions POSIX, particulièrement ceux qui semblent se dupliquer, il est généralement bon de vérifier le standard lui-même . En bas, vous verrez souvent des exemples, ainsi que le raisonnement derrière la mise en œuvre (et l'existence) des deux.

dans ce cas:

les sections suivantes sont informatives.

Exemples

redirection Sortie Standard vers un fichier

l'exemple suivant ferme la sortie standard pour les processus courants, ré-assigne la sortie standard pour aller au fichier référencé par pfd , et ferme le descripteur de fichier original pour nettoyer.

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

Messages D'Erreur De Redirection

l'exemple suivant redirige les messages de stderr à stdout .

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

L'Utilisation De L'Application

néant.

"1519430920 la" Justification

les fonctions dup() et dup2() sont redondantes. Leurs services sont également fournis par la fonction fcntl() . Ils ont été inclus dans ce volume de la norme IEEE 1003.1-2001 principalement pour des raisons historiques, puisque de nombreuses applications existantes les utilisent.

alors que le bref segment de code montré présente un comportement très similaire à dup2() , un segment de code conforme la mise en œuvre basée sur d'autres fonctions définies dans ce volume de la norme IEEE 1003.1-2001 est beaucoup plus complexe. L'effet le moins évident est l'effet possible d'une fonction de capture de signal qui pourrait être invoquée entre les étapes et attribuer ou désallouer les descripteurs de fichiers. Cela pourrait être évité en bloquant les signaux.

la fonction dup2() n'est pas marquée obsolescente parce qu'elle présente une version sans danger de la fonctionnalité fournie dans une version sans danger par fcntl() . Il est utilisé dans la reliure POSIX Ada.

la fonction dup2() n'est pas destinée à être utilisée dans les régions critiques comme mécanisme de synchronisation.

dans la description de [EBADF], le cas des fildes étant hors de portée est couvert par le cas donné des fildes n'étant pas valable. Les descriptions pour fildes et fildes2 sont différentes parce que le seul type d'invalidité qui est pertinent pour fildes2 est si elle est hors de portée; en d'autres termes, il importe peu que fildes2 renvoie à un fichier ouvert lorsque l'appel dup2() est lancé.

Orientations Futures

néant.

voir aussi

close() , fcntl() , open() , les définitions de base volume de la norme IEEE 1003.1-2001, <unistd.h>

Changer L'Histoire

publié pour la première fois dans le numéro 1. Dérivé de Numéro 1 de la le SVID.

9
répondu Tim Post 2016-10-17 18:48:19

un exemple pratique est la redirection des messages de sortie vers un autre flux comme un fichier journal. Voici un exemple de code pour la redirection d'e/S.

Veuillez vous référer à l'original post ici

#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()");
}
4
répondu vinit dhatrak 2017-05-23 11:47:23
La redirection

I/O dans le shell serait très probablement implémentée en utilisant les appels système dup2/fcnlt.

nous pouvons facilement émuler le type de redirection $program 2>&1 > logfile.log en utilisant la fonction dup2.

le programme ci-dessous redirige stdout et stderr .I. e émule le comportement de $program 2>&1 > output en utilisant le 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
0
répondu maitreyak 2018-06-21 15:42:38