des exemples pratiques d'utilisation dup ou dup2
Je sais ce que dup
/dup2
fait, mais je n'ai aucune idée de quand elle sera utilisée.
Tout des exemples pratiques?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Je sais ce que dup
/dup2
fait, mais je n'ai aucune idée de quand elle sera utilisée.
Tout des exemples pratiques?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Un exemple d'utilisation serait redirection d'e/S. Pour cela, vous fourche d'un enfant et fermer le stdin ou stdout descripteurs de fichiers (0 et 1) et puis tu fais une dup() sur un autre filedescriptor de votre choix qui va maintenant être connecté à les plus bas disponibles descripteur de fichier, qui est dans ce cas, 0 ou 1.
Cela, vous pouvez maintenant exec n'importe quel processus enfant qui est peut-être pas au courant de votre application et à chaque fois que l'enfant écrit sur la sortie standard (ou lit l'entrée standard stdin, ce que vous avez configuré) les données sont écrites sur le filedescriptor à la place.
Coquilles de l'utiliser pour mettre en œuvre des commandes avec des tuyaux, par exemple
/bin/ls | more
en connectant la sortie standard d'un processus pour le stdin de l'autre.dup()
pour copier stdout vers un autre descripteur de fichier avant de rediriger elle. De cette façon, vous pouvez unredirect plus tard. Si vous avez utilisédup2()
, vous risqueriez de remplacement d'un descripteur.Le meilleur scénario pour comprendre dup et dup2 est de la redirection.
La première chose que nous devons savoir, c'est que le système a 3 fichier par défaut id(ou des variables indiquant entrée ou de sortie des sources) qui traite de l'entrée et de sortie. Ils sont
stdin
,stdout
,stderr
, en nombres entiers, ils sont0
,1
,2
. La plupart des fonctions commefprintf
oucout
sont directement sortie destdout
.Si nous voulons rediriger la sortie, un moyen, c'est de donner, par exemple,
fprintf
fonction de plus d'arguments indiquantin
etout
.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
etdup2
exactement de travail dans cette situation.Commençons par un exemple simple maintenant: supposons que nous voulons rediriger la sortie de
fprintf
à un fichier txt nommé "chinaisbetter.txt". Tout d'abord nous avons besoin pour ouvrir ce fichierEnsuite, nous voulons
stdout
à point "chinaisbetter.txt" en utilisant dup fonction:Maintenant stdout(1) points pour le descripteur "chinaisbetter.txt" même si c'est toujours 1, mais la sortie est redirigée maintenant.
Ensuite, vous pouvez utiliser
printf
que la normale, mais les résultats seront dans le fichier txt au lieu de l'afficher directement sur l'écran: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, nous disons "copie" ici, ils ne sont pas tout recopier.
L'id de fichier se rapporte ici au gestionnaire du fichier. Le descripteur de fichier mentionné ci-dessus est une struct les enregistrements du fichier de l'information.
s/fprintf/printf/g
.fprintf
écrit explicitement nommé descripteur de fichier.printf
écrit àstdout
.Lorsque vous êtes curieux de connaître les fonctions POSIX, surtout ceux qui semblent à se dupliquer, il est généralement bon de de vérifier la norme elle-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 à titre d'information.
Exemples
Rediriger la Sortie Standard vers un Fichier
L'exemple suivant ferme la sortie standard pour les processus en cours, ré-attribue la sortie standard d'aller dans le fichier référencé par
pfd
, et ferme le descripteur de fichier d'origine à nettoyer.De Rediriger Les Messages D'Erreur
L'exemple suivant redirige les messages de
stderr
àstdout
.L'Utilisation De L'Application
Aucun.
Justification
La
dup()
etdup2()
fonctions sont redondantes. Leurs services sont également fournis par lefcntl()
fonction. Ils ont été inclus dans ce volume de la norme IEEE Std 1003.1-2001 essentiellement pour des raisons historiques, depuis de nombreuses applications existantes utiliser.Tandis que le bref segment de code indiqué est très similaire au comportement de
dup2()
, conforme mise en œuvre sur la base d'autres fonctions telles que définies dans le présent volume de la norme IEEE Std 1003.1-2001 est beaucoup plus complexe. Moins évident est l'effet possible d'un signal-la capture de fonction qui pourrait être invoquée entre les étapes et d'allouer ou libérer des descripteurs de fichier. Cela pourrait être évité par le blocage des signaux.La
dup2()
fonction n'est pas marquée comme obsolète, car il présente un type sûr de la version de la fonctionnalité fournie dans un type dangereux version parfcntl()
. Il est utilisé dans la POSIX Ada liaison.La
dup2()
fonction n'est pas prévu pour une utilisation dans des régions critiques comme un mécanisme de synchronisation.Dans la description de [EBADF], le cas de fildes être hors de portée est couvert par l'affaire de fildes ne pas être valide. Les descriptions de
fildes
etfildes2
sont différents parce que le seul type d'invalidité qui est pertinent pourfildes2
est de savoir si elle est hors de portée, qui est, il n'a pas d'importance sifildes2
fait référence à un fichier ouvert lorsque ledup2()
l'appel est fait.Orientations Futures
Aucun.
Voir aussi
close()
,fcntl()
,open()
, les Définitions de Base du volume de la norme IEEE Std 1003.1-2001,<unistd.h>
Changer L'Histoire
D'abord été publié dans le Numéro 1. Dérivés de la Question 1 de la SVID.
En est un exemple pratique de rediriger les messages de sortie de certains autres flux comme certains le fichier de log. Voici un exemple de code pour la redirection d'e/S.
Veuillez vous référer à l'original post ici
Redirection d'e/S à l'interpréteur de commandes devrait probablement être mis en œuvre à l'aide de dup2/fcnlt appels système.
On peut facilement imiter la
$program 2>&1 > logfile.log
type de redirection à l'aide de la fonction dup2.Le programme ci-dessous redirige les deux stdout et stderr .j'.e émule le comportement de
$program 2>&1 > output
à l'aide de la dup2.