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.
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.
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 :
-
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.
-
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.
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.
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()");
}
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