66 votes

exemples pratiques utiliser dup ou dup2

Je sais ce qui fait dup ou dup2 mais je n'ai aucune idée du moment où il serait utilisé. Avez-vous des exemples pratiques ? Merci.

66voto

Fönsi Points 4573

Un exemple d'utilisation serait la redirection des entrées/sorties. Pour cela, vous créez 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 exécuter 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 du stdin, selon votre configuration) les données sont écrites sur le filedescriptor fourni à la place.

Les shells utilisent ceci pour implémenter des commandos avec des pipes, par exemple /bin/ls | more en connectant le stdout d'un processus au stdin de l'autre.

2 votes

@nshy : Vous pouvez utiliser l'ordinaire dup() pour copier stdout vers un autre descripteur de fichier avant de le rediriger. De cette façon, vous pourrez le dé-diriger plus tard. Si vous avez utilisé dup2() vous risquez d'écraser un descripteur existant.

0 votes

@krusty : Voir cette réponse à une autre question du S.O.

27voto

ZijunLost Points 101

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 ids de fichiers par défaut (ou variables indiquant les sources de sortie ou d'entrée) qui traitent l'entrée et la sortie. Il s'agit de stdin , stdout , stderr en nombres entiers, ils sont 0 , 1 , 2 . La plupart des fonctions comme fprintf o cout sont directement transmises à stdout .
Si nous voulons rediriger la sortie, une façon est de donner, par exemple, fprintf fonction plus d'arguments indiquant in y out .
Cependant, il existe un moyen plus élégant : nous pouvons écraser les identifiants de fichiers par défaut pour qu'ils pointent vers le fichier que nous voulons recevoir en sortie. dup y dup2 exactement le travail dans cette situation.
Commençons par un exemple simple : supposons que nous voulions rediriger la sortie de l'application fprintf dans un fichier txt nommé "chinaisbetter.txt". Tout d'abord, nous devons ouvrir ce fichier

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

Alors nous voulons stdout pour pointer vers "chinaisbetter.txt" en utilisant la fonction dup :

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.
Vous pouvez alors utiliser printf comme d'habitude, mais les résultats seront dans le fichier txt au lieu de s'afficher directement à l'écran :

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

PS :

  1. Ceci ne donne qu'une explication intuitive, vous devrez peut-être consulter la page de manuel ou des informations détaillées. En fait, nous disons "copie" ici, ils ne copient pas tout.

  2. L'identifiant du fichier fait ici référence au gestionnaire du fichier. Le descripteur de fichier mentionné ci-dessus est une structure qui enregistre les informations du fichier.

1 votes

Cette réponse nécessite une bonne s/fprintf/printf/g . fprintf écrit dans le descripteur de fichier explicitement nommé. printf écrit à stdout .

10voto

Tim Post Points 21270

Lorsque vous êtes curieux de connaître les fonctions POSIX, en particulier celles qui semblent se dupliquer, il est généralement bon de vérifier la norme elle-même . En bas de page, vous trouverez généralement des exemples, ainsi que le raisonnement qui sous-tend la mise en œuvre (et l'existence) des deux.

Dans ce cas :

The following sections are informative.
EXAMPLES
Redirecting Standard Output to a File

The following example closes standard output for the current processes, re-assigns standard output to go to the file referenced by pfd, and closes the original file descriptor to clean up.
#include <unistd.h>
...
int pfd;
...
close(1);
dup(pfd);
close(pfd);
...

Redirecting Error Messages

The following example redirects messages from stderr to stdout.
#include <unistd.h>
...
dup2(1, 2);
...

APPLICATION USAGE

None.
RATIONALE

The dup() and dup2() functions are redundant. Their services are also provided by the fcntl() function. They have been included in this volume of IEEE Std 1003.1-2001 primarily for historical reasons, since many existing applications use them.

While the brief code segment shown is very similar in behavior to dup2(), a conforming implementation based on other functions defined in this volume of IEEE Std 1003.1-2001 is significantly more complex. Least obvious is the possible effect of a signal-catching function that could be invoked between steps and allocate or deallocate file descriptors. This could be avoided by blocking signals.

The dup2() function is not marked obsolescent because it presents a type-safe version of functionality provided in a type-unsafe version by fcntl(). It is used in the POSIX Ada binding.

The dup2() function is not intended for use in critical regions as a synchronization mechanism.

In the description of [EBADF], the case of fildes being out of range is covered by the given case of fildes not being valid. The descriptions for fildes and fildes2 are different because the only kind of invalidity that is relevant for fildes2 is whether it is out of range; that is, it does not matter whether fildes2 refers to an open file when the dup2() call is made.
FUTURE DIRECTIONS

None.
SEE ALSO

close(), fcntl(), open(), the Base Definitions volume of IEEE Std 1003.1-2001, <unistd.h>
CHANGE HISTORY

First released in Issue 1. Derived from Issue 1 of the SVID.

0 votes

Quelle est la définition de la redirection ? Tout ce que vous écrivez sur fd1 sera également écrit sur fd2.

3 votes

C'est inutile. Vous auriez aussi bien pu dire RTFM.

5voto

vinit dhatrak Points 1247

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 des E/S.
Veuillez vous référer au message original 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()");
}

1voto

maitreyak Points 229

La redirection des entrées/sorties dans le shell serait très probablement implémentée en utilisant les appels système dup2/fcnlt.

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

Le programme ci-dessous redirige à la fois 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X