dup2 / dup - pourquoi aurais-je besoin de dupliquer un descripteur de fichier?
J'essaie de comprendre l'utilisation de dup2
et dup
.
À partir de la page de man :
DESCRIPTION
dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.
The two descriptors do not share the close-on-exec flag, however.
dup uses the lowest-numbered unused descriptor for the new descriptor.
dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.
RETURN VALUE
dup and dup2 return the new descriptor, or -1 if an error occurred
(in which case, errno is set appropriately).
Pourquoi aurais-je besoin que l'appel système? qu'est-ce que l'utilisation de dupliquer le descripteur de fichier?
Si j'ai le descripteur de fichier, pourquoi voudrais-je à en faire une copie?
Je vous en serais reconnaissant si vous pouviez expliquer et me donner un exemple où dup2
/dup
est nécessaire.
Grâce
- Comment voulez-vous mettre en œuvre la tuyauterie de la fonctionnalité de coquilles sans
dup
oudup2
? Vous devez appelerpipe(2)
et ensuite d'avoir l'un des descripteurs de fichierdup
-ed, par exempleSTDIN_FILENO
- Double Possible de des exemples pratiques d'utilisation dup ou dup2
InformationsquelleAutor JAN | 2012-07-24
Vous devez vous connecter pour publier un commentaire.
La dup de l'appel système à dupliquer un descripteur existant, de retour d'un nouveau
se réfère à la même sous-jacent I/O de l'objet.
Dup permet de coquilles de mettre en œuvre des commandes comme ceci:
Le 2>,&1 indique au shell pour donner la commande d'un descripteur de fichier 2 qui est une copie du descripteur de 1. (j'.e stderr & stdout point de même fd).
Maintenant le message d'erreur pour l'appel de ls sur fichier non-existant et le bon de sortie de ls sur fichier existant apparaître dans tmp1 fichier.
L'exemple de code suivant exécute le programme avec wc, entrée standard connecté
à la fin de lecture d'un tuyau.
L'enfant dup la lire sur le descripteur de fichier 0, ferme le fichier de
scriptors dans p, et chefs wc. Lorsque wc lit sur son entrée standard, il lit à partir de la
la pipe.
C'est de cette façon que les tuyaux sont mis en œuvre à l'aide de dup, bien qu'une utilisation de dup maintenant, vous utilisez le tuyau pour construire quelque chose d'autre, c'est la beauté des appels système,vous construisez une chose après l'autre à l'aide des outils qui sont déjà là , ces outil ont été successivement construits à l'aide de quelque chose d'autre, etc ..
À la fin des appels système sont les outils les plus simples que vous obtenez dans le noyau
Cheers 🙂
dup
est utile pour l'appelant et de ne pas lels
programme lui-même? Est-il un avantage d'avoirdup
utilisé dans le programme comme ls lui-même si on a déjà accès au fichier? Ici par exemple,ls
écrit erreurs de2
qui est codé en dur, j'ai donc un moyen de contourner cela en tant que consommateur dels
. Je pense que c'est un point subtil non?dup(p[STDIN])
mais alors de jeter le résultat. Avez-vous l'intention d'utiliserdup2(p[STDIN], 0)
?dup
doit retourner 0.dup2
explicite sur les fd qui doit être utilisé, au lieu de simplement en utilisant la plus faible de libre-fd, donc je préférerais que.exec*
à partir d'un processus multithread. Mais je ne suis pas le filetage de l'expert 🙂fork
je pensais: linuxprogrammingblog.com/...Une autre raison pour dupliquer un descripteur de fichier est de l'utiliser avec
fdopen
.fclose
ferme le descripteur de fichier qui a été transmis àfdopen
, donc si vous ne voulez pas le fichier d'origine descripteur d'être fermé, il vous faut le dupliquer avecdup
premier.fdopen()
semble ne pas dupliquer un descripteur de fichier, il suffit de créer de la mémoire tampon dans l'espace utilisateur.dup
la fd avant de passer àfdopen
depuisfclose
va la fermer.fclose
si vous ne voulez pas le fichier descripteur d'être fermé? Parlez-vous seulement dans le cas de comme une fonction de la bibliothèque vous n'avez pas de contrôle que les appelsfclose
, et que vous appelezdup
avant d'appeler une fonction de la bibliothèque de la laisser ouverte?FILE
poignée d'accéder à une affection préexistante ouvrir le fichier via stdio interfaces, vous devez appelerfclose
pour désallouer queFILE
poignée. Si vous souhaitez continuer à utiliser le sous-jacent d'ouvrir le fichier, ou si votre logiciel architecture est telle qu'à l'origine le "propriétaire" de code pour le fichier descripteurclose
, le fait quefclose
ferme également le sous-jacent descripteur de fichier que vous avez donné àfdopen
est un problème. Vous pouvez éviter ce problème en utilisantdup
de faire un nouveau descripteur de fichier pour le même fichier ouvert pour passer àfdopen
, de sorte quefclose
ne pas fermer l'original.Certains points liés à la dup/dup2 peut être noté veuillez
dup/dup2 - Techniquement, le but est de partager un Fichier d'Entrée de la table à l'intérieur d'un seul processus par différentes poignées. ( Si nous sommes bifurquer le descripteur de fichier est dupliqué par défaut dans le processus de l'enfant et le fichier d'entrée de la table est également partagée).
Cela signifie que nous pouvons avoir plus d'un descripteur de fichier ayant éventuellement des attributs différents pour un seul d'ouvrir le fichier d'entrée de la table à l'aide de dup/fonction dup2.
(Mais semble actuellement seulement FD_CLOEXEC drapeau est le seul attribut pour un descripteur de fichier).
http://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html
Différences sont (pour la dernière)- en dehors de quelques errno valeur beteen dup2 et fcntl
près suivie par fcntl peut soulever des conditions de course depuis deux appels de fonction sont impliqués.
Détails peut être vérifiée à partir de la
http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html
Un Exemple d'utilisation -
Un exemple intéressant tout en mettant en œuvre le contrôle du travail dans un shell, où l'utilisation de la dup/dup2 peut être vu ..dans le lien ci-dessous
http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs
dup est utilisé pour être en mesure de rediriger la sortie d'un processus.
Par exemple, si vous souhaitez enregistrer la sortie d'un processus, vous dupliquez la sortie (fd=1), vous rediriger la copie de l'fd vers un fichier, puis de la fourche et exécuter le processus, et lorsque le processus est terminé, vous rediriger à nouveau enregistrées fd à la sortie.